设计模式(二十一)策略模式

作者: 我犟不过你 | 来源:发表于2021-01-25 16:56 被阅读0次

    1、概述

    策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

    2、使用场景

    1)当你想使用对象中各种不同的算法变体, 并希望能在运行时切换算法时, 可使用策略模式。
    2)当你有许多仅在执行某些行为时略有不同的相似类时, 可使用策略模式。
    3)如果算法在上下文的逻辑中不是特别重要, 使用该模式能将类的业务逻辑与其算法实现细节隔离开来。
    4)当类中使用了复杂条件运算符以在同一算法的不同变体中切换时, 可使用该模式。实际就是减少逻辑判断。

    3、实例

    以支付宝、微信支付举例:
    创建一个支付接口:

    package com.cloud.bssp.designpatterns.Strategy;
    
    /**
     * 支付策略接口
     * @date: 2021/1/25
     * @author weirx
     * @version 3.0
     */
    public interface IPayStrategy {
    
        /**
         * 支付
         */
        void pay();
    }
    
    

    定义其两个实现类:

    /**
     * 微信
     * @date: 2021/1/25
     * @author weirx
     * @version 3.0
     */
    public class WXPay implements IPayStrategy{
    
        @Override
        public void pay() {
            System.out.println("使用微信支付");
        }
    }
    
    /**
     * 支付宝
     * @date: 2021/1/25
     * @author weirx
     * @version 3.0
     */
    public class ZFBPay implements IPayStrategy{
    
        @Override
        public void pay() {
            System.out.println("使用支付宝支付");
        }
    }
    

    测试类,有客户端判断使用那种方式,在代码里面需要些逻辑判断:

    /**
     * 测试类
     * @date: 2021/1/25
     * @author weirx
     * @version 3.0
     */
    public class TestDemo {
    
        public static void main(String[] args) {
            IPayStrategy wxPay = new WXPay();
            IPayStrategy zfbPay = new ZFBPay();
    
            boolean flag = true;
            if (flag) {
                wxPay.pay();
            } else {
                zfbPay.pay();
            }
        }
    }
    

    结果:

    使用微信支付
    

    下面我们看看如何消除客户端中的if、else:
    增加一个枚举类,在枚举类内部提供newInstance方法,根据传入code值进行支付方式的初始化。

    /**
     * 支付策略
     * @date: 2021/1/25
     * @author weirx
     * @version 3.0
     */
    public enum PayStrategyEnum {
    
    
        /**
         * weixin
         */
        WEIXIN("weixin") {
            @Override
            public IPayStrategy create() {
                return new WXPay();
            }
        },
        /**
         * zhifubao
         */
        ZHIFUBAO("zhifubao") {
            @Override
            public IPayStrategy create() {
                return new ZFBPay();
            }
        };
    
        /**
         * 根据枚举值获取bean实例
         * @param analyseTypeEnum
         * @return
         */
        public static IPayStrategy newInstance(PayStrategyEnum analyseTypeEnum) {
            return analyseTypeEnum.create();
        }
    
        public abstract IPayStrategy create();
    
        private String code;
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        PayStrategyEnum(String code) {
            this.code = code;
        }
    
        /**
         * 根据code获取枚举
         * @param code
         * @return
         */
        public static PayStrategyEnum getEnum(String code) {
            for (PayStrategyEnum value : values()) {
                if (value.getCode().equals(code)) {
                    return value;
                }
            }
            return null;
        }
    
    }
    

    测试类

    /**
     * 测试类
     * @date: 2021/1/25
     * @author weirx
     * @version 3.0
     */
    public class TestDemo {
    
        public static void main(String[] args) {
            IPayStrategy wx = PayStrategyEnum.newInstance(PayStrategyEnum.getEnum("weixin"));
            wx.pay();
    
            IPayStrategy zfb = PayStrategyEnum.newInstance(PayStrategyEnum.getEnum("zhifubao"));
            zfb.pay();
        }
    }
    

    结果:

    使用微信支付
    使用支付宝支付
    

    4、分析

    IPayStrategy.png

    通过策略模式,使我们的代码非常的简洁。
    客户端只与支付策略接口和枚举类有关系,不需要关心具体的支付方法。
    利于扩展其他支付方式,而不需要修改原有的代码。
    使用枚举方式减少我们代码中的if、else等的逻辑判断,增加可读性。

    5、总结

    优点:
    1)你可以在运行时切换对象内的算法。
    2)你可以将算法的实现和使用算法的代码隔离开来。
    3)开闭原则。 你无需对上下文进行修改就能够引入新的策略。
    缺点:
    1)如果你的算法极少发生改变, 那么没有任何理由引入新的类和接口。 使用该模式只会让程序过于复杂。
    2)客户端必须知晓策略间的不同——它需要选择合适的策略。

    相关文章

      网友评论

        本文标题:设计模式(二十一)策略模式

        本文链接:https://www.haomeiwen.com/subject/yanbzktx.html