示例类图

策略模式.png
示例代码
抽象策略
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();
}
}
策略工厂
import java.util.HashMap;
import java.util.Map;
public class PromotionStrategyFactory {
private static Map<String, PromotionStrategy>
PROMOTION_STRATEGY_MAP = new HashMap<String, PromotionStrategy>();
static {
PROMOTION_STRATEGY_MAP.put(PromotionKey.LIJIAN,
new LiJianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN,
new FanXianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN,
new ManJianPromotionStrategy());
}
private static final PromotionStrategy
NON_PROMOTION = new EmptyPromotionStrategy();
private PromotionStrategyFactory(){}
public static PromotionStrategy getPromotionStrategy(String promotionKey){
PromotionStrategy promotionStrategy =
PROMOTION_STRATEGY_MAP.get(promotionKey);
return promotionStrategy == null ? NON_PROMOTION : promotionStrategy;
}
private interface PromotionKey{
String LIJIAN = "LIJIAN";
String FANXIAN = "FANXIAN";
String MANJIAN = "MANJIAN";
}
}
客户端
- 主要看第三个main方法,其示例了策略模式如何替换掉大量的if ... else ...;
- 客户端是面向使用策略的角色(PromotionActivity)编程的;
- promotionKey 可以看成是 if ... else ... 中传入的参数,策略模式配合享元模式,将原来在每个判断分支中现new,变成在工厂类中都先new好,然后根据传入 if ... else ... 的参数去工厂里取;
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();
// }
// public static void main(String[] args) {
// PromotionActivity promotionActivity = null;
//
// String promotionKey = "LIJIAN";
//
// if(StringUtils.equals(promotionKey,"LIJIAN")){
// promotionActivity = new PromotionActivity(new LiJianPromotionStrategy());
// }else if(StringUtils.equals(promotionKey,"FANXIAN")){
// promotionActivity = new PromotionActivity(new FanXianPromotionStrategy());
// }//......
// promotionActivity.executePromotionStrategy();
// }
public static void main(String[] args) {
String promotionKey = "MANJIANxxx";
PromotionActivity promotionActivity =
new PromotionActivity(
PromotionStrategyFactory.getPromotionStrategy(promotionKey)
);
promotionActivity.executePromotionStrategy();
}
}
输出:
无促销活动