策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。比如,商场搞活动的时候,会有打折、满减、返券等优惠活动,而这些优惠就是策略,它们之间可以相互替换。
结构
策略模式的主要角色组成:
- 上下文角色(Context):用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略,算法的直接访问,封装可能存在的变化。
- 抽象策略角色(Strategy):定义每个策略或算法必须具有的方法和属性。
- 具体策略角色(ConcreteStrategy):用于实现抽象策略中的操作,即实现具体的算法。
优缺点:
优点:
- 算法多样性,且具备自由切换功能。
- 有效避免多重条件判断,增强了封装性,简化了操作,降低出错概率。
- 扩展性良好,策略类遵顼 里氏替换原则,可以很方便地进行策略扩展。
缺点:
- 策略类数量增多,且所有策略类都必须对外暴露,以便客户端能进行选择。
代码实现
上下文Context
public class Context {
Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
//上下文接口
public void contextInterface() {
strategy.algorithmInterface();
}
}
抽象策略
public abstract class Strategy {
//算法方法
public abstract void algorithmInterface();
}
具体策略
public class ConcreteStrategyA extends Strategy {
@Override
public void algorithmInterface() {
System.out.println("算法A实现");
}
}
public class ConcreteStrategyB extends Strategy {
@Override
public void algorithmInterface() {
System.out.println("算法B实现");
}
}
客户端
public class Client {
public static void main(String[] args) {
Context context;
context = new Context(new ConcreteStrategyA());
context.contextInterface();
context = new Context(new ConcreteStrategyB());
context.contextInterface();
}
}
控制台输出:
算法A实现
算法B实现