7.设计模式-策略模式(行为型)
案例
抽象策略角色
规定策略或算法的行为
package com.promotion;
public interface IPromotionStrategy {
void doPromotion();
}
具体策略角色
具体的策略或算法实现
package com.promotion;
public class GroupbuyStrategy implements IPromotionStrategy {
public void doPromotion() {
System.out.println("5人成团,可以优惠");
}
}
package com.promotion;
public class EmptyStrategy implements IPromotionStrategy {
public void doPromotion() {
System.out.println("无优惠");
}
}
package com.promotion;
public class CouponStrategy implements IPromotionStrategy {
public void doPromotion() {
System.out.println("使用优惠券抵扣");
}
}
package com.promotion;
public class CashbackStrategy implements IPromotionStrategy {
public void doPromotion() {
System.out.println("返现,直接打款到支付宝账号");
}
}
上下文角色
用来操作策略的上下文环境
package com.promotion;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class PromotionStrategyFacory {
private static Map<String,IPromotionStrategy> PROMOTIONS = new HashMap<String,IPromotionStrategy>();
static {
PROMOTIONS.put(PromotionKey.COUPON,new CouponStrategy());
PROMOTIONS.put(PromotionKey.CASHBACK,new CashbackStrategy());
PROMOTIONS.put(PromotionKey.GROUPBUY,new GroupbuyStrategy());
}
private static final IPromotionStrategy EMPTY = new EmptyStrategy();
private PromotionStrategyFacory(){}
public static IPromotionStrategy getPromotionStrategy(String promotionKey){
IPromotionStrategy strategy = PROMOTIONS.get(promotionKey);
return strategy == null ? EMPTY : strategy;
}
private interface PromotionKey{
String COUPON = "COUPON";
String CASHBACK = "CASHBACK";
String GROUPBUY = "GROUPBUY";
}
public static Set<String> getPromotionKeys(){
return PROMOTIONS.keySet();
}
}
调用
package com.promotion;
public class Test {
public static void main(String[] args) {
String promotionKey = "GROUPBUY";
PromotionStrategyFacory.getPromotionKeys();
IPromotionStrategy promotionStrategy = PromotionStrategyFacory.getPromotionStrategy(promotionKey);
promotionStrategy.doPromotion();
}
}
优点
- 符合开闭原则
- 避免使用多重条件转移语句,如if else
- 使用策略模式可以提高算法的保密性和安全性
缺点
- 客户端必须知道所有的策略,并且自行决定使用哪一个策略类,这个也是跟委派模式的区别所在
- 会有多个策略类,增加维护难度
委派模式跟策略模式的区别
- 策略模式必须知道所有的策略,然后再决定使用哪一种策略,策略的重点在于选择哪种方式,并且是可以相互替
代的 - 委派模式注重的是把任务下发下去
- 策略模式是委派模式内部的一种实现方式
自我理解:委派模式就是只有1个策略的策略模式!!!
例子为什么使用策略工厂PromotionStrategyFactory
通过策略工厂存储所有策略,便于调用时获取正确的策略,同时避免的if...else... 的判断
策略模式使用前提是什么?即满足什么条件你才能去选策略?真正用的时候需要告诉客户端什么?当然你也可以按照约定实现策略。
某一种“算法”有多种实现时,可以抽象出算法的接口,所有策略实现该接口。真正使用时需要告诉用户有哪些策略,让用户选择策略,或者在用户不选择的情况下选择默认策略