0x00 概述
策略模式目的是把算法的定义和使用分开。客户端根据需要动态选择所需要的算法。符合面向接口编程。
0x01 组成部分
- Context:环境类,持有Strategy引用。
- Strategy:抽象策略类,定义方法接口。
- ConcteteStrategy:具体策略类。
UML架构图如下:
0x10 示例代码
package com.kkk.pattern.strategy;
/**
* 员工类,充当环境类Context。
* Created by z3jjlzt on 2018/2/28.
*/
public class Employee {
//出行方式
private Strategy strategy;
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void explain() {
this.strategy.travel();
}
}
/**
* 抽象策略接口.
* Created by z3jjlzt on 2018/2/28.
*/
public interface Strategy {
void travel();
}
/**
* Created by z3jjlzt on 2018/2/28.
*/
public class Subway implements Strategy {
@Override
public void travel() {
System.out.println("乘坐地铁上班!!");
}
}
/**
* Created by z3jjlzt on 2018/2/28.
*/
public class Walk implements Strategy {
@Override
public void travel() {
System.out.println("11路上班!!");
}
}
/**
* Created by z3jjlzt on 2018/2/28.
*/
public class Client {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setStrategy(new Subway());
employee.explain();
employee.setStrategy(new Walk());
employee.explain();
}
}
输出结果:
乘坐地铁上班!!
11路上班!!
0xff 总结
- 优点:符合开闭原则,新增策略类方便;代码复用。
- 缺点:客户端需要清楚具体的策略的行为,策略类数目有可能很多。
- 适用场景:系统需要动态在多个方法中进行选择;代码中有多重选择语句。