设计模式-策略模式

    我们知道Java里共有23种设计模式,可以避免多重分支的if...else...switch语句,策略模式属于行为型设计模式。

策略模式

定义

它是将定义的算法家族、分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。

适用场景

(1) 假如系统中有很多类,而他们的区别仅仅在于它们的行为不同。
(2) 一个系统需要动态地在几种算法中选择一种。
(3) 需要屏蔽算法规则。

优点

(1) 策略模式符合开闭原则。
(2) 避免使用多重条件转义语句,如if...else...switch语句。
(3) 使用策略模式可以提高算法的保密性和安全性。

缺点

(1) 客户端必须知道所有的策略,并且自行决定使用哪个策略类。
(2) 代码中会产生非常多的策略类,增加维护难度。

实例

/**
 * 促销抽象策略
 */
public interface IPromotionStrategy {
    void doPromotion();
}
/**
 * 优惠券抵扣策略
 */
public class CouponStrategy implements IPromotionStrategy {

    @Override
    public void doPromotion() {
        System.out.println("使用优惠券抵扣!");
    }
}
/**
 * 返现抵扣策略
 */
public class CaskBackStrategy implements IPromotionStrategy {

    @Override
    public void doPromotion() {
        System.out.println("直接返现到支付宝!");
    }
}
/**
 * 团购抵扣策略
 */
public class GroupBuyStrategy implements IPromotionStrategy {

    @Override
    public void doPromotion() {
        System.out.println("5人成团,可以优惠!");
    }
}
/**
 * 默认无抵扣策略
 */
public class EmptyStrategy implements IPromotionStrategy {

    @Override
    public void doPromotion() {
        System.out.println("无优惠!");
    }
}
/**
 * 抵扣策略上下文
 */
public class PromotionContext {

    private static Map map = new HashMap();

    static {
        //抵扣策略扩展
        map.put("COUPON", new CouponStrategy());
        map.put("CASHBACK", new CaskBackStrategy());
        map.put("GROUPBUY", new GroupBuyStrategy());
    }

    private static final IPromotionStrategy EMPTY = new EmptyStrategy();

    public static IPromotionStrategy getPromotionStrategy(String strategyKey) {
        IPromotionStrategy strategy = map.get(strategyKey);
        return strategy == null ? EMPTY : strategy;
    }
}
/**
 * 测试类
 */
public class Test {

    public static void main(String[] args) {
        //客户端已知所有抵扣策略
        IPromotionStrategy strategy = PromotionContext.getPromotionStrategy("CASHBACK");
        strategy.doPromotion();
    }
}
以上为个人对策略模式的总结。

你可能感兴趣的:(设计模式-策略模式)