【设计模式】策略模式

star2017 1年前 ⋅ 843 阅读

简介

定义了一系列的算法,把他们封装起来,他们相互之间可以替换,某个算法的调整或者新增不会影响其他的算法,是在执行期间来选择具体的算法,使用什么算法被推迟到运行时,使得系统更加灵活,复用性更高,该模式可以减少if else的数量,属于行为型。

适用场景

1、系统有很多类,但是他们的区别只是行为不同
2、一个系统需要动态的在几个算法中选择一种

优点

1、可以减少ifelse语句
2、提高算法的保密性和安全性
3、符合开闭原则

缺点

1、客户端需要知道所有策略类,自己决定使用哪个策略类
2、类的数量增加

代码示例

image.png
订单策略接口

public interface OrderStrategy {
    OrderTypeEnum supportType();
    void saveOrder();
}

支付宝下单策略

public class AlipayStrategy implements OrderStrategy {
    public OrderTypeEnum supportType() {
        return OrderTypeEnum.ALIPAY;
    }
    public void saveOrder() {
        System.out.println("支付宝支付完成");
    }
}

微信下单策略

public class WxpayStrategy implements OrderStrategy{
    public OrderTypeEnum supportType() {
        return OrderTypeEnum.WXPAY;
    }
    public void saveOrder() {
        System.out.println("微信支付完成");
    }
}

空策略类

public class EmptyStrategy implements OrderStrategy {
    public OrderTypeEnum supportType() {
        return null;
    }
    public void saveOrder() {
        System.out.println("没有支付方式");
    }
}

订单类型枚举类

public enum OrderTypeEnum {
    /**
     * 支付宝、微信
     */
    ALIPAY,WXPAY
}

下单工厂类

public class OrderFactory {
    private OrderFactory(){
    }
    /** spring下通过spring来获取所有的bean */
    private static OrderStrategy[] strategies = new OrderStrategy[]{new AlipayStrategy(),new WxpayStrategy()};
    private static OrderStrategy EMPTY_STRATEGY = new EmptyStrategy();
    private static OrderStrategy getOrderStrategy(String orderType) {
        for (OrderStrategy handler : strategies) {
            if (handler.supportType().name().equals(orderType)) {
                return handler;
            }
        }
        return EMPTY_STRATEGY;
    }
    public static void saveOrder(String orderType){
        getOrderStrategy(orderType).saveOrder();
    }
}

测试类

public class StrategyTest {
    public static void main(String[] args) {
        OrderFactory.saveOrder("ALIPAY");
        OrderFactory.saveOrder("WXPAY");
        OrderFactory.saveOrder("ICBC");
    }
}

输出结果为:

支付宝支付完成
微信支付完成
没有支付方式

上面示例源码

源码分析

spring中应用

Resource
image.png
如图,有不同的策略类,
image.png

InstantiationStrategy从名字上就可以看出是策略模式,
image.png

image.png
也可以通过set方法来进行配置。

public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) {
	this.instantiationStrategy = instantiationStrategy;
}
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: