您的位置:首页 > 其它

学习设计模式笔记--策略模式

2017-11-21 11:12 387 查看
注: 本篇笔记内容及案例来自互联网其他博客

 策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

 这个模式涉及到三个角色:

  ●  环境(Context)角色:持有一个Strategy的引用。

  ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

使用场景

  假设现在要设计一个二手车系统。本系统可能对所有的高级会员提供每辆20%的促销折扣;对中级会员提供每辆10%的促销折扣;对初级会员没有折扣。

  根据描述,折扣是根据以下的几个算法中的一个进行的:

  算法一:对初级会员没有折扣。

  算法二:对中级会员提供10%的促销折扣。

  算法三:对高级会员提供20%的促销折扣。

  

代码实现:

抽象策略类:

MemberStrategy.java

/**
* 抽象策略
* @author
*
*/
public interface MemberStrategy {

/**
* 计算车的价格
* @param carPrice
* @return
*/
public double calcPrice(double carPrice);
}


具体策略类

初级会员:

PrimaryMemberStrategy.java

/**
* 初级会员没有折扣
* @author
*
*/
public class PrimaryMemberStrategy implements MemberStrategy {

@Override
public double calcPrice(double carPrice) {

return carPrice;
}

}


中级会员:

IntermediateMemberStrategy.java

/**
* 中级会员的折扣为10%
* @author
*
*/
public class IntermediateMemberStrategy implements MemberStrategy {

@Override
public double calcPrice(double carPrice) {

return carPrice * 0.9;
}

}


高级会员:

AdvancedMemberStrategy.java

/**
* 高级会员的折扣为20%
* @author
*
*/
public class AdvancedMemberStrategy  implements MemberStrategy{

@Override
public double calcPrice(double carPrice) {
return carPrice * 0.8;
}

}


价格类,需要注入抽象策略

Price.java

/**
* 价格类
* @author
*
*/
public class Price {

private MemberStrategy strategy;

public Price(MemberStrategy strategy){
this.strategy = strategy;
}

/**
* 计算折后价格
* @param carPrice
* @return
*/
public double quote(double carPrice){

return strategy.calcPrice(carPrice);
}

}


测试类:

public class Client {
public static void main(String[] args) {
MemberStrategy strategy = new AdvancedMemberStrategy();
Price price = new Price(strategy);
double quote = price.quote(50000);
System.out.println("车辆折后价格:" + quote );
}

}


输出结果:

车辆折后价格:40000.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式