用漫画的方式讲策略设计模式,一看就懂

640?wx_fmt=jpeg

/   今日科技快讯   /

近日,上海市市场监管局牵头召集拼多多、美团点评、国美在线、小红书、饿了么、洋码头等22家电商企业召开行政约谈会,通报网络市场存在虚假宣传、部分商品存在质量问题、随意更改促销活动规则等情况,要求电商企业依法依规开展集中促销活动。

/   作者简介   /

大家周一好,新的一周继续加油!

本篇文章来自天才少年_的投稿,分享了用漫画的形式来讲解策略模式,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。

天才少年_的博客地址:

https://blog.csdn.net/dfskhgalshgkajghljgh

/   正文   /

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=png

小安实现的代码如下:

/**
 * @Author: 程序员小安
 * @description: 购物车
 * @CreateDate: 2019/10/27
 * @Version: 1.0
 */
public class ShopCart {
    public ShopCart() {
    }
    public void pay(String payType) {
        if (Constant.WEIXIN_PAY.equals(payType)) {
            //调用微信支付SDK
            System.out.println("您选择的微信支付");
        } else if (Constant.ALI_PAY.equals(payType)) {
            //调用支付宝支付SDK
            System.out.println("您选择的支付宝支付");
        } else if (Constant.WEIXIN_FRIEND_PAY.equals(payType)) {
            //调用微信好友支付SDK
            System.out.println("您选择的找微信好友支付");
        } else if (Constant.QQ_PAY.equals(payType)) {
            //调用QQ支付SDK
            System.out.println("您选择的QQ钱包支付");
        } else {
            System.out.println("您选择的支付方式暂未开通");
        }
    }
}

/**
 * @Author: 程序员小安
 * @description: 购物车常量
 * @CreateDate: 2019/10/27
 * @Version: 1.0
 */
public class Constant {
    public static final String WEIXIN_PAY = "1";//微信支付
    public static final String ALI_PAY = "2";//支付宝支付
    public static final String WEIXIN_FRIEND_PAY = "3";//找微信好友支付
    public static final String QQ_PAY = "4";//QQ钱包支付
}

public class MyClass {
    public static void main(String[] args){
        ShopCart shopCart = new ShopCart();
        shopCart.pay(Constant.WEIXIN_PAY);
    }
}

运行结果:

您选择的微信支付

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

策略模式

定义了算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

官方定义不太好理解,我翻译一下,在策略模式中,会针对一个行为(比如支付),定义多个实现类,每个类都封装具体的实现算法,并且为了保证他们是同一行为,通常这些实现类,都会实现同一个接口。比如微信支付,支付宝支付,微信好友支付,QQ支付,缺省支付方式都是一个算法。

采用策略模式的UML图:

640?wx_fmt=png

行为接口:

/**
 * @Author: 程序员小安
 * @description: 支付接口
 * @CreateDate: 2019/10/27
 * @Version: 1.0
 */
public interface Payment {
    void pay(String price);
}

具体的支付算法:

/**
 * @Author: 程序员小安
 * @description: 微信支付方式
 * @CreateDate: 2019/10/27
 * @Version: 1.0
 */
public class WeixinPay implements Payment {
    @Override
    public void pay(String price) {
        //调用微信支付SDK
        System.out.println("微信支付金额:" + price);
    }
}

微信好友支付、QQ支付、淘宝支付和无支付方式代码同上。购物车代码:

/**
 * @Author: 程序员小安
 * @description: 购物车
 * @CreateDate: 2019/10/27
 * @Version: 1.0
 */
public class ShopCart {
    private Payment payment;

    public ShopCart() {
    }

    public void setPayment(Payment payment) {
        this.payment = payment;
    }

    public void pay(String price) {
        payment.pay(price);
    }
}

public class MyClass {
    public static void main(String[] args){
        ShopCart shopCart = new ShopCart();
        WeixinPay weixinPay = new WeixinPay();
        shopCart.setPayment(weixinPay);
        shopCart.pay("12");
    }
}

运行结果:

微信支付金额:12

采用策略模式后,当新增支付方式时,只需要实现一个继承Payment接口的类即可,Shopcart类不需要做任何改动,做到了对修改关闭,对扩展开放的原则,同时也做到针对接口编程,而不是针对实现编程的设计原则。其实真正的项目中,Shopcart是个很复杂的类,里面会有很多业务逻辑,在新增业务不改动旧逻辑,会增加项目的稳定性,也减少测试的工作投入。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

策略模式的优点

策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

策略模式的缺点

客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

什么时候使用

某些业务中,某一个行为,会有多个实现类,并且在一次运行中,当前业务只会选择一种实现类。比如商场卖衣服,会有个会员行为,普通会员,银牌会员,金牌会员,客户只能是会员中的一个,不同的人是不同类型的会员,所以他们之间是可以动态替换的。

推荐阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值