(1)概述
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变换不会影响客户的使用;它属于对象行为模式,通过对算法进行封装,把使用算法的责任和算法的实现分开,并委派给不同的对象对这些算法进行管理
(2)结构
- 抽象策略类:该角色给出所有的策略类所需的接口
- 具体策略类:实现抽象策略定义的接口,提供具体的算法实现或行为
- 环境类:持有一个策略类的引用,供客户端调用
(3)案例
以促销活动为例
抽象策略类
public interface Strategy {
/**
* 展示促销活动
*/
void show();
}
具体策略类
public class StrategyA implements Strategy {
@Override
public void show() {
System.out.println("促销活动A");
}
}
public class StrategyB implements Strategy {
@Override
public void show() {
System.out.println("促销活动B");
}
}
public class StrategyC implements Strategy {
@Override
public void show() {
System.out.println("促销活动C");
}
}
环境类
public class SalesMan {
private Strategy strategy;
public SalesMan(Strategy strategy) {
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
/**
* 促销员展示促销活动
*/
public void salesManShow() {
strategy.show();
}
}
Client
public class Client {
public static void main(String[] args) {
//促销活动A
SalesMan salesMan = new SalesMan(new StrategyA());
salesMan.salesManShow();
System.out.println("=======================");
//促销活动B
salesMan.setStrategy(new StrategyB());
salesMan.salesManShow();
System.out.println("=======================");
//促销活动C
salesMan.setStrategy(new StrategyC());
salesMan.salesManShow();
}
}
(4)优缺点
- 策略类之间可以自由切换
- 新增策略时增加对应的具体策略类即可,复合开闭原则
- 在一定程度上减少了条件选择语句的使用
- 客户端必须知道所有的策略类,并自行决定使用哪一个
- 可能产生很多的具体策略类
(5)使用场景
- 系统中需要动态的在几种算法中选择一种时
- 一个类定义了多种行为,且这些行为在这个类的操作中以多个条件语句的形式出现时,可将每个分支条件移入各自对应的策略类中
- 系统中的算法各自独立,且要求对客户隐藏实现的细节时
- 多个类只区别在表现型为不同,可选择策略模式,在运行时动态选择具体要执行的行为
评论 (0)