设计模式——策略模式
定义: 该模式定义了一系列算法, 并将每个算法封装起来, 使他们可以相互替换, 并且替换后不影响使用. 通过对算法进行封装, 把使用算法的责任和算法的实现分开, 然后委派给不同的对象进行管理. 例如旅行时到达目的地可以选择汽车, 火车, 飞机, 轮船最终都会到达目的地.
结构:
- 抽象策略类: 通常是一个抽象类或者接口. 该类给出所有具体策略类需要实现的接口
- 具体策略类: 实现抽象策略类定义的接口
- 环境类: 持有策略类的引用, 供用户调用
实现:
例: 促销活动, 不同的节日有不同的促销活动, 销售员将不同的促销活动展示给客户
抽象策略类
public interface Strategy {
void show();
}
具体策略类
StrategyA
public class StrategyA implements Strategy {
public void show() {
System.out.println("买一送一");
}
}
StrategyB
public class StrategyB implements Strategy {
public void show() {
System.out.println("买一送二");
}
}
StrategyC
public class StrategyC implements Strategy {
public void show() {
System.out.println("买一送三");
}
}
环境类
@AllArgsConstructor
@Data
public class SalesMan {
private Strategy strategy;
public void salesManShow() {
strategy.show();
}
}
Main
public class Main {
public static void main(String[] args) {
SalesMan salesMan = new SalesMan(new StrategyA());
salesMan.salesManShow();
salesMan.setStrategy(new StrategyB());
salesMan.salesManShow();
salesMan.setStrategy(new StrategyC());
salesMan.salesManShow();
}
}
使用场景
- 一个系统需要动态在几种算法中选择一种时, 可以将每个类封装到策略类中
- 一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现, 可以把每个条件分支的代码放到各自的策略类中来代替这些语句
- 系统中各算法彼此完全独立, 且要求对客户隐藏细节时