策略模式(Strategy Pattern)
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。

三个角色:
- 抽象策略(Strategy)角色:该角色对策略、算法进行抽象,通常定义每个策略或算法必须具有的方法和属性。
/**
* 抽象策略角色
*
* @author Jenson
*/
@Data
public abstract class DiscountStrategy {
/**
* 书的价格
*/
private double price = 0;
/**
* 书的数量
*/
private int number = 0;
public DiscountStrategy(double price, int number) {
this.price = price;
this.number = number;
}
/**
* 策略方法--计算折扣
*
* @return 折扣
*/
public abstract double calculateDiscount();
}
- 具体策略(Concrete Strategy)角色:该角色实现抽象策略中的具体操作,含有具体的算法
public class FixDiscountStrategy extends DiscountStrategy {
public FixDiscountStrategy(double price, int number) {
super(price, number);
}
@Override
public double calculateDiscount() {
return getNumber() * 1;
}
}
- 环境(Context)角色:该角色也叫上下文角色,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问,它持有一个Strategy类的引用。
/**
* 环境角色
*
* @author Jenson
*/
public class Context {
private DiscountStrategy ds;
public Context(DiscountStrategy ds) {
this.ds = ds;
}
public double contextCalDisc() {
return ds.calculateDiscount();
}
}
调用
/**
* @author Jenson
*/
public class StrategyMain {
public static void main(String[] args) {
Context context = new Context(new FixDiscountStrategy(40, 60));
System.out.println("折扣为:" + context.contextCalDisc());
}
}
缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式造成很多的策略类。
网友评论