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

前言:

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

        日常生活中,有很多种支付方式:微信、支付宝、银行、现金。对于后端而言,不同支付方式则对应着不同的程序逻辑,脑子里一下就蹦出了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();
    }
}

        测试结果:

【设计模式】简单理解策略模式_第1张图片

你可能感兴趣的:(设计模式,策略模式)