设计模式---策略模式

定义:
定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。
消除掉 if…else

适用场景:
系统有很多类,而他们的区别仅仅在于他们的行为不同
一个系统需要动态地在几种算法中选择一种

优点:
开闭原则
避免使用多重条件转移语句
提高算法的保密性和安全性

缺点:
客户端必须知道所有的策略类,并自行决定使用哪一种策略类
产生很多的策略类

相关设计模式:
策略模式和工厂模式
策略模式和状态模式

Coding:

public interface PromotionStrategy {

    void doPromotion();

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

}

策略模式 + 工厂方法

import java.util.HashMap;
import java.util.Map;

public class PromotionStrategyFactory {

    private static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap();

    static {
        PROMOTION_STRATEGY_MAP.put(PromotionStrategyKey.FANXIAN, new FanXianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionStrategyKey.LIJIAN, new LiJianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionStrategyKey.MANJIAN, new ManJianPromotionStrategy());
    }

    private static PromotionStrategy emptyPromotionStrategy = new EmptyPromotionStrategy();

    public static PromotionStrategy getPromotionStrategy(String promotionStrategyKey){
        PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionStrategyKey);
        return promotionStrategy == null ? emptyPromotionStrategy : promotionStrategy;
    }

    private interface PromotionStrategyKey {
        String FANXIAN = "FANXIAN";
        String LIJIAN = "LIJIAN";
        String MANJIAN = "MANJIAN";
    }
}
public class Test {

    public static void main(String[] args) {
        String promotionStrategyKey = "LIJIAN";
        PromotionActivity promotionStrategy = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionStrategyKey));
        promotionStrategy.executePromotionStrategy();
    }

}

JDK中java.util.Comparator就是一种策略模式,有多种实现策略。
1、java.util.Arrays#parallelSort(T[], java.util.Comparator<? super T>) 通过传入的比较器进行排序
2、java.util.TreeMap#TreeMap(java.util.Comparator<? super K>)
3、org.springframework.core.io.Resource 的多种实现 也是策略模式
4、SpringBean的初始化:org.springframework.beans.factory.support.InstantiationStrategy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值