概念
其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
特点
策略模式体现了面向对象程序设计中非常重要的两个原则:
封装变化的概念。编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。
组成
抽象策略角色这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。对比来说,就是我们的Comparator接口。具体策略角色包装了具体的算法和行为。对比来说,就是实现了Comparator接口的实现一组实现类。环境角色内部会持有一个抽象角色的引用,给客户端调用。对比来说,就是我们的TreeSet类。说明:TreeSet内部一定会有一个策略类的一个成员变量,这样做的目的在于可以当我们在去创建TreeSet对象的时候,可以接收我们向TreeSet类中传递的具体的策略类。
编写步骤
定义抽象策略角色(为策略对象定义一个公共的接口)
编写具体策略角色(实际上就是实现上面定义的公共接口)
定义环境角色,内部持有一个策略类的引用
定义抽象策略角色
public interface PriceStrategy {
double getPrice(double price);
}
定义具体策略角色
public class CommonFewPriceStrategy implements PriceStrategy{
@Override
public double getPrice(double price) {
return price;
}
}
public class CommonManyPriceStrategy implements PriceStrategy{
@Override
public double getPrice(double price) {
return price*0.99;
}
}
定义策略上下文角色
public class PriceContext {
private PriceStrategy strategy;
public PriceContext(PriceStrategy strategy) {
this.strategy = strategy;
}
public double getPrice(double price){
return strategy.getPrice(price);
}
}
测试
public class StrategyTest {
public static void main(String[] args){
PriceStrategy strategy=new MemberManyPriceStrategy();
PriceContext context=new PriceContext(strategy);
double price = context.getPrice(1000);
System.out.println(price);
}
}