参考书籍:《Head First设计模式》、《大话设计模式》
策略模式
什么是策略模式?
它定义了算法族,分别封装起来,让它们之间可以互相替换,而且使它们还可以相互替换。策略模式让算法的变化独立于使用算法的客户。
角色 | 含义 |
Context |
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
|
Strategy |
定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
|
ConcreteStrategy | 实现了Strategy定义的接口,提供具体的算法实现。 |
组成角色
Strategy(抽象策略角色): 策略类,通常由一个接口或者抽象类实现。
ConcreteStrategy(具体策略角色):包装了相关的算法和行为。
Context(环境角色):持有一个策略类的引用,最终给客户端调用。
策略模式有什么优点?
优点:
1,算法完成的是同一个工作,只是实现不同,可以用相同的调用方式来实现不同的算法,减少了各种算法类和使用算法类之间的耦合。
2,Strategy为Context定义了可重用的算法、行为,继承有助于提取出公用的功能
3,易于扩展,增加一个新的策略可以不改变原有代码
3,简化了单元测试,每个算法类,可以通过自己的接口来单独测试
策略模式的类结构
适用场景
对于有相似行为的类,在运行时动态选择具体执行的行为
对调用者隐藏具体策略的实现细节
体现的设计原则
1,封装原则
2,面向接口编程
面向接口中的接口不是指全用interface来编程(这个接口指的是抽象类和接口),真正的意思是指面向supertype编程,关键是多态,能在运行时动态绑定子类类型,而不是绑死supertype类上,比如,Dog d=new Dog();
d.shout();
应该写成
Animal a=new Dog();
a.shout();
这样,我们就可以在运行时绑定类型
3,多用组合,少用继承
实例说明
Strategy
package com.company.designPattern.strategy;
public interface Strategy {
public void strategy();
}
两个ConcreteStrategy
package com.company.designPattern.strategy;
public class ConcreteStrategyA implements Strategy{
@Override
public void strategy() {
System.out.println("面对暴躁的男老板,执行A策略!");
}
}
package com.company.designPattern.strategy;
public class ConcreteStrategyB implements Strategy {
@Override
public void strategy() {
System.out.println("面对暴露的女老板, 执行B策略!");
}
}
Context
package com.company.designPattern.strategy;
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy=strategy;
}
public void executeStrategy(){
strategy.strategy();
}
}
测试类
package com.company.designPattern.strategy;
public class Test {
public static void main(String[] args) {
Context context=new Context(new ConcreteStrategyA());
context.executeStrategy();
context=new Context(new ConcreteStrategyB());
context.executeStrategy();
}
}