【设计模式】简单理解策略模式

本文通过日常生活中的支付方式为例,介绍了策略模式如何解决if-else分支的代码冗余问题,强调了其在解耦和扩展性方面的优势,以及策略接口和具体策略类的实现方式。
摘要由CSDN通过智能技术生成

前言:

        作者是未踏入职场的小白,写此篇博客的目的旨在加深自己的策略模式的理解,同时期望能让不了解策略模式的读者有一个简单的认知。

        日常生活中,有很多种支付方式:微信、支付宝、银行、现金。对于后端而言,不同支付方式则对应着不同的程序逻辑,脑子里一下就蹦出了if-else分支处理,代码如下:

public void pay(String type){
        if(type.equals("wechat")){
            System.out.println("微信支付...");
        }else if(type.equals("alipay")){
            System.out.println("支付宝支付...");
        }else if(type.equals("bank")){
            System.out.println("银行卡支付...");
        }else{
            System.out.println("现金支付...");
        }
    }

        就可读性而言,代码是清晰易懂的,但后期由于用户需求需要添加其它支付方式时,我们就只能再继续添加if-else语句,代码如下

public void pay(String type){
        if(type.equals("wechat")){
            new WechatHandler().pay();
        }else if(type.equals("alipay")){
            System.out.println("支付宝支付...");
        }else if(type.equals("bank")){
            System.out.println("银行卡支付...");
        }else if(type.equals("cash")){
            System.out.println("现金支付...");
        }else{
            System.out.println("京东支付...");
        }
    }

        在面向对象的设计原则中,有一个开闭原则对扩展开放、对修改关闭。我们希望需求变化时,优先考虑创建新的类和子类去扩展,而这种来一个需求就改动代码的处理方式显然不符合开闭原则。接下来我将通过引入策略模式来解决这些冗余的代码。

策略模式:

        (1)什么是策略模式?

        以上述为例,不同支付方式对应的程序逻辑就是一种策略,我们只需要将这些策略封装到具体的策略类中,并与一个策略接口进行“通信”即可(策略接口只负责声明策略,具体的实现逻辑由策略类决定)。

        (2)策略模式有什么优缺点?

        优点:解耦,当有新需求时我们只需添加一个新的策略类封装程序逻辑即可,无需改动代码,灵活性较高。

        缺点:由于每一种策略都对应一个策略类,所以类的数量较多,在可读性方面也稍逊于if-else模式。

Code:

        (1)策略接口:

public interface PaymentHandler {
    
    //只做声明
    void pay();
}

        (2)具体策略类:

public class WechatPaymentHandler implements PaymentHandler {
    
    @Override
    public void pay() {
        System.out.println("微信支付...");
    }
}

public class AlipayPaymentHandler implements PaymentHandler {


    @Override
    public void pay() {
        System.out.println("支付宝支付...");
    }
}

public class BankPaymentHandler implements PaymentHandler {


    @Override
    public void pay() {
        System.out.println("银行卡支付...");
    }
}

public class CashPaymentHandler implements PaymentHandler {


    @Override
    public void pay() {
        System.out.println("现金支付");
    }
}

        pay方法所封装的程序逻辑就是我们所说的“策略”。

        (3)测试:

public class PaymentDemo {
    public static void main(String[] args) {

        PaymentHandler handler = new WechatPaymentHandler();
        pay(handler);

    }
    
    //方法形参是PaymentHandler,表示与策略接口进行通信(多态)
    //传入不同的具体策略类则会执行不同的程序逻辑
    public static void pay(PaymentHandler handler){
        handler.pay();
    }
}

        测试结果:

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值