一文简单全面了解策略模式的使用【花几分钟轻松掌握一个知识点】_策略模式怎么知道调用哪个策略

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

本文重点:介绍策略模式概念以及实际应用。
干货满满,建议收藏,需要用到时常看看。小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

在这里插入图片描述

文章目录

在这里插入图片描述

问题需求(支付系统渠道商的选择问题)

聚合支付项目对接了三个渠道商,分别渠道商A,渠道商B,渠道商C,每个渠道商都有一套独立的对接文档(从商户入驻,到支付,到清算)。那么该如何实现这个功能呢?

问题解决

V1.0版本

V1.0版本就是直接梭哈,将所有的业务逻辑写在了客户端,客户端在调用的时候可以分别调用各个渠道商的商户入驻方法。

public class Client {
    public static void main(String[] args) {
        Client client = new Client();
        client.addCustomerA("商户1");
        client.addCustomerB("商户2");
        client.addCustomerC("商户3");
    }

    public String addCustomerA(String customer) {
        System.out.println("渠道商A入驻"+customer+"成功");
        return "success";
    }


    public String addCustomerB(String customer) {
        System.out.println("渠道商B入驻"+customer+"成功");
        return "success";
    }

    public String addCustomerC(String customer) {
        System.out.println("渠道商C入驻"+customer+"成功");
        return "success";
    }
}


上述代码把策略和调用都放在了客户端中,从中不难看出,如果要在增加一个渠道商的话,则必定要修改客户端 增加新渠道商的商户入驻方法。这样就会导致客户端变得十分臃肿复杂维护起来非常麻烦,同时也没有体现面向对象的设计思想,在实际开发中写出这样的代码怕是要被老板优化。 那么我们该如何优化呢?

v1.1版本

从面向对象的角度出发,每个渠道商抽象成一个具体的对象,用一个单独的类保存其属性和行为,同时公共行为(商户入驻的行为)则用一个接口来定义,每个渠道商的类分别实现这个接口。

  1. 定义公共的接口Income,该接口主要是规范了各个渠道商的行为,这里通过addCustomer方法定义了商户入驻的行为。
public interface Income {
    /\*\*
 \* 商户入驻
 \* @return
 \*/
    String addCustomer(String customer);
}

  1. 定义各个渠道商的类,这里分别定义了MerchantAIncome,MerchantBIncome以及MerchantCIncome 三个渠道商的类,并且这三个类都实现了Income接口的addCustomer方法,实现商户入驻。
public class MerchantAIncome implements Income {
    @Override
    public String addCustomer(String customer) {
        System.out.println("渠道商A入驻"+customer+"成功");
        return "success";
    }
}

  1. 定义环境类Context,这里的环境类主要的作用就是持有一个Income对象的引用,并且该Income对象所能操作的各种行为(即各种策略)。
public class Context {
    private Income income;

    public Context(Income income) {
        this.income = income;
    }

    public String addCustomer(String customer) {
        return income.addCustomer(customer);
    }
}

  1. 定义调用客户端
public class Client {
      public static void main(String[] args) {
        new Context(new MerchantAIncome()).addCustomer("商户1");
        new Context(new MerchantBIncome()).addCustomer("商户2");
        new Context(new MerchantCIncome()).addCustomer("商户3");
    }
}

UML图

上述代码的UML图如下图所示:这里有三个主要的角色:

  1. 环境类Context
  2. 抽象的策略Income接口
  3. 具体的策略MerchantAIncome,MerchantBIncome以及MerchantCIncome这三个类。
    在这里插入图片描述
    如上图所示:每个渠道商的类都是实现了一个公共的接口,该接口定义了渠道商中各种行为,包括商户入驻等等。客户端判断当前使用的是哪个渠道商。然后,生成该渠道商的实例,接着调用该渠道商的相关方法。每个渠道商自身的变化不会影响到客户端。相比较于V1.0版本而言,代码逻辑简洁了很多,增加一个渠道商的话只需要再增加一个渠道商的类,并且在客户端中加上一个判断,符合开闭原则。这里就引出了本文将要介绍的模式----策略模式。

策略模式

定义

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值