一、基本介绍
- 策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的应用方。
- 策略模式体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类;第三、多用组合/聚合,少用继承。
二、代码实现
(1)创建策略接口和实现类
public interface Strategy {
void impl();
}
public class StrategyOne implements Strategy {
@Override
public void impl() {
System.out.println("实现方式一");
}
}
public class StrategyTwo implements Strategy {
@Override
public void impl() {
System.out.println("实现方式二");
}
}
(2)创建实现抽象类和子类
public abstract class Context {
Strategy strategy;
public Context() {
}
public abstract void display();
public void impl() {
if(strategy != null) {
strategy.impl();
}
}
}
public class ContextOne extends Context {
public ContextOne() {
strategy = new StrategyOne();
}
@Override
public void display() {
System.out.println("内容一");
}
}
public class ContextTwo extends Context{
public ContextTwo() {
strategy = new StrategyTwo();
}
@Override
public void display() {
System.out.println("内容二");
}
}
(3)测试
public class Client {
public static void main(String[] args) {
Context contextOne = new ContextOne();
contextOne.display();
contextOne.impl();
Context contextTwo = new ContextTwo();
contextTwo.display();
contextTwo.impl();
}
}
三、UML类图
四、策略模式小结
- 策略模式的关键是:分析项目中变化部分与不变部分
- 策略模式的核心思想是:多用组合/聚合 少用继承;用行为类组合,而不是行为的继承。
- 体现了"开闭原则",客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重判断语句。
- 每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大