概念:
The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
策略模式定义了一组算法,各自封装,并且可以互相替代。策略算法使得算法和使用算法的客户端非常的独立。也就是实现了算法和使用环境的解耦。
概括一下就是三个词:行为 环境 解耦
类图
角色分析:
Strategy:a family of algorithms的父接口或抽象父类
ConcreteStrategy:a family of algorithms,封装了具体的算法。
Context:即”clients that use it”,持有一个Strategy的引用。可以具体实例化为一个ConcreteStrategy
举例
这个例子是实现商场购物一组优惠算法,包括满额现金赠送、满额减免、折扣、满额积分赠送。为了节省篇幅具体算法没有实现,只是做了一个打印。
/*
* Strategy
*/
public abstract class PromotionStrategy {
public void promote() {
}
}
/*
* ConcreteStrategy1
*/
public class Derate extends PromotionStrategy {
public void promote() {
System.out.println("减免");
}
}
/*
*
ConcreteStrategy2
*/
public class Discount extends PromotionStrategy {
public void promote() {
System.out.println("打折");
}
}
/*
*ConcreteStrategy3
*/
public class RewardCash extends PromotionStrategy {
public void promote() {
System.out.println("现金赠送");
}
}
/*
* ConcreteStrategy4
*/
public class RewardCredits extends PromotionStrategy {
public void promote() {
System.out.println("积分赠送");
}
}
/*
*Context
*/
public class Client {
PromotionStrategy strategy;
public Client(PromotionStrategy strategy){
this.strategy = strategy;
}
public static void main(String[] args) {
Client client = new Client(new Discount());
client.strategy.promote();
}
}
这样就实现了一组算法的抽象。
适用场景
多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
对客户隐藏具体策略(算法)的实现细节,彼此完全独立。