一、策略模式
一句话总结:if...else...的优雅写法,可以配合委托模式一起使用
- 定义:
定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户
- 补充定义:处理大量
if...else...
代码 - 类型:行为型
- 适用场景:
- 系统有很多类,而他们的区别仅仅在于他们的行为策略不同
- 一个系统需要动态地在几种算法中选择一种
- 优点:
- 符合开闭原则
- 避免使用多重条件转移语句
- 提高算法的保密性和安全性
- 缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 产生很多策略类
- 相关设计模式
- 策略模式和
工厂模式
:工厂模式是创建型的,策略模式是行为型的,工厂模式接收指令创建符合要求的实例对象,而策略模式接收创建好的对象从而实现不同的行为 - 策略模式和
状态模式
:对于策略模式客户端需要知道到底选择哪个策略,而在使用状态模式时客户端不需要关心具体的状态,它的这些状态会自动装换
二、Coding
public interface PromotionStrategy {
void doPromotion();
}
public class EmptyPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("无促销活动");
}
}
public class FanXianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("返现促销,返回的金额存放到慕课网用户的余额中");
}
}
public class LiJianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("立减促销,课程的价格直接减去配置的价格");
}
}
public class ManJianPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("满减促销,满200-20元");
}
}
public class PromotionActivity {
private PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}
public void executePromotionStrategy(){
promotionStrategy.doPromotion();
}
}
public class Test {
public static void main(String[] args) {
PromotionActivity promotionActivity618 = new PromotionActivity(new LiJianPromotionStrategy());
PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy());
promotionActivity618.executePromotionStrategy();
promotionActivity1111.executePromotionStrategy();
}
立减促销,课程的价格直接减去配置的价格
返现促销,返回的金额存放到慕课网用户的余额中
- UML类图:
- 说明:其实类图很简单,四个策略类实现了策略接口,活动实体类组合了类接口,动态调用时通过活动实体构造方法传入不同的策略,然后执行对应的策略。
三、源码中的应用
- java.util.Comparator:这个比较器就是一个抽象的策略,它提供了
compare()和equals()方法
,所有的策略都要实现这两个方法,它内部还有一堆具体的策略可供使用
public interface Comparator<T> {
...
int compare(T o1, T o2);
...
boolean equals(Object obj);
...
}