7.设计模式-策略模式(行为型)

资料:https://gitee.com/chuanqi1995/java

案例

抽象策略角色

规定策略或算法的行为

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();
    }
}

优点

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

缺点

  1. 客户端必须知道所有的策略,并且自行决定使用哪一个策略类,这个也是跟委派模式的区别所在
  2. 会有多个策略类,增加维护难度

委派模式跟策略模式的区别

  1. 策略模式必须知道所有的策略,然后再决定使用哪一种策略,策略的重点在于选择哪种方式,并且是可以相互替
    代的
  2. 委派模式注重的是把任务下发下去
  3. 策略模式是委派模式内部的一种实现方式

自我理解:委派模式就是只有1个策略的策略模式!!!

例子为什么使用策略工厂PromotionStrategyFactory

通过策略工厂存储所有策略,便于调用时获取正确的策略,同时避免的if...else... 的判断

策略模式使用前提是什么?即满足什么条件你才能去选策略?真正用的时候需要告诉客户端什么?当然你也可以按照约定实现策略。

某一种“算法”有多种实现时,可以抽象出算法的接口,所有策略实现该接口。真正使用时需要告诉用户有哪些策略,让用户选择策略,或者在用户不选择的情况下选择默认策略

posted @ 2022-03-23 17:29  Java-Legend  阅读(40)  评论(0编辑  收藏  举报