1.策略模式
定义:
适用场景:
优点:
缺点:
与策略模式相关的一些模式的区别:
工厂模式接收指令,创建出符合要求的具体对象,而策略模式接受已经创建好的对象,从而实现不同的行为,因为他是行为模式,不属于创建模式。
使用策略模式,客户端必须明确知道具体的状态,状态模式的话客户端是不需要知道具体的状态的。这些状态会自动转换。
策略模式的适用场景:当一个类具有多种状态的时候,并且在不同的状态下行为有差异的时候就可以适用策略模式,减少if-else的业务。
2.类图
比如在在双十一的活动中有三个促销策略,首先是返现策略,比如满两百返二十,然后是立减策略,然后是满减策略。
然后双十一这个活动就可以看作是一个上下文对象,保存了不同的策略的抽象,他与这个策略是一个组合的关系,促销策略是整个双十一活动的一部分。
public interface PromotionStrategy {
void doSomething();
}
public class FanXianStrategy implements PromotionStrategy {
@Override
public void doSomething() {
System.out.println("购买返现30");
}
}
public class LiJianStrategy implements PromotionStrategy {
@Override
public void doSomething() {
System.out.println("购买立减20");
}
}
public class ManJianStrategy implements PromotionStrategy {
@Override
public void doSomething() {
System.out.println("满500减50");
}
}
活动类持有策略:
public class PromotionActivity {
private PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}
public void execute(){
promotionStrategy.doSomething();
}
}
这样使用起来就很僵硬,因为后端要做大量的if else判断。
所以需要结合工厂和单例和策略来消除if else:
package com.wx.design_pattern.strategy;
import java.util.HashMap;
import java.util.Map;
/**
* User: Mr.Wang
* Date: 2019/12/7
*/
public class SrategyFactory {
private SrategyFactory() {
}
private static Map<String, PromotionStrategy> PROMOTION_STRATEGY = new HashMap<>();
static {
PROMOTION_STRATEGY.put(PromotionStrategyKey.LI_JIAN, new LiJianStrategy());
PROMOTION_STRATEGY.put(PromotionStrategyKey.MAN_JIAN, new ManJianStrategy());
PROMOTION_STRATEGY.put(PromotionStrategyKey.FAN_XIAN, new FanXianStrategy());
}
public static PromotionStrategy getPromotionStrategy(String key) {
return PROMOTION_STRATEGY.get(key) == null ? new EmptyStrategy() : PROMOTION_STRATEGY.get(key);
}
/**
* 用接口起到一个分组作用,当然可以使用枚举,可以使用常量
*/
private interface PromotionStrategyKey {
String LI_JIAN = "lijian";
String MAN_JIAN = "manjian";
String FAN_XIAN = "fanxian";
}
}
策略模式呢通常不是单独的使用,一般都要结合工厂啊,单例啊,享元模式来实现一段优雅的逻辑
3.策略模式的通用类图:
这个策略和Context是聚合的关系