设计模式—策略模式
定义:定义一系列的算法,将算法进行封装、隔离、相互独立、又能相互替换
使用场景:第三方支付方式选择、底层多套API的调用
* 支付实现原理:
* 1.定义支付服务接口PayService ,里面有一个payHtml方法,供选择某种支付方式
* 2.定义具体的支付方式实现类,例如:阿里支付、微信支付、银行卡支付..。该类继承PayService接口
* 3.定义枚举 PayContentConstant。code是支付别名,className是具体支付方式实现类的类名
* 4.定义支付上下文PayContent,定义一个变量payServiceHashMap用于存储当前所有的支付方式。当Spring扫描该类的时候,
* 后将所有的支付方式注入到当前的Map中。定义一个payHtml方法用于让用户选择那种支付方式,根据支付方式去跳转到某一支付页
*
* 策略模式条件:
* 某一抽象接口服务(支付接口)、N个具体接口服务(具体支付方式)、枚举或者常量(存储支付方式与对应的支付实现关系)、
* 支付上下文(满足用户选择某种支付方式)
设计模式—装饰模式
定义:在不改变原有对象的基础上,扩展很多功能
使用场景:网关+日志记录+接口限流+API鉴权等
* 装饰实现原理:
* 1.定义一个厂家Producer ,它具有生产的功能
* 2.定义一个厂家具体执行者ConcreteProducer,它主要负责组装购买需要的配件
* 3.定义一个汽车生产者 CarProducer,主要负责生产汽车
* 4.该汽车生产者,负责生产本田汽车(HondaProducer)与宝马汽车(BmwProducer)
* 5.定义生产线ProductLine,里面有N个生产线,比如 carProductLine生产线,也就是汽车生产线。
* 它的执行顺序为 出场检验-宝马生产-本田汽车生产
*
* 装饰条件:
* 某一个抽象的接口服务(厂家服务)、基础功能实现(配件生产者)、装饰者(汽车生产者)、具体装饰者1、具体装饰者2、
* 具体装饰者N..
*
* 总结:首先定义一个抽象的接口作为父类。将基础的功能或者不变的功能抽离作为父类的一个执行者。
* 定义装饰者A,装饰者A下有:具体的装饰者A1、具体的装饰者A2、具体的装饰者A2
* 定义装饰者B,装饰者下有B:具体的装饰者B1、具体的装饰者B2、具体的装饰者B2
设计模式—责任链模式
定义:责任链是一种动态的行为模式。是由每一个对象对下家的引用,形成一个链条。请求在链条上运行,直到某一个对象处理这个请求。
客户端并不知道那个链条处理此请求,使系统能动态的组织和分配责任。
责任链模式实现原理
* 我们用财务审批流程来阐述实现原理
* 1.定义一个抽象的父类BaseHandler,在BaseHandler中定义个BaseHandler变量,定义BaseHandler变量的getter和setter方法
* 用于获取与设置当前对象。在BaseHandler中定义一个财务审批的方法 void handlerMoney(int money)
* 2.定义三个处理者 TemManager(团队经理)、GeneralManager(总经理)、FinanceManager(财务经理)。三者均继承BaseHandler
* 来处理报销请求。假设 TemManager的下一个处理者为GeneralManager、GeneralManager下个处理者为FinanceManager。FinanceManager
* 无下个处理者。TemManager能处理的金额为<=2000,GeneralManager能处理的金额为<=20000,FinanceManager能处理的金额为<=200000。
* 每一个处理者,超出处理范围传递给下一个处理者。超出200000,FinanceManager将不通过。
* 3.那么如何设置下一个处理者呢?例如TemManager的构造器
* public TemManager(BaseHandler baseHandler) {
* this.setBaseHandler(baseHandler);
* }
* 当前方法设置下一个处理者,而通过getBaseHandler().handlerMoney(money);
* 将把责任交给下一个处理者,直至处理结束。
*
* 条件:一个抽象责任父类接口(BaseHandler)、N个具体责任执行者(TemManager)、初始化责任执行者必须设置
* 下一个执行者。也就是 new TemManager(下一个执行者)。
* 通过this.setBaseHandler(baseHandler);设置当前责任对象
* 通过getBaseHandler().handlerMoney(money); 获取当前责任对象并处理请求。
*
* 总结:责任链的执行过程对外是不可见的。对于用户来说只知道请求被处理了,而不知道被谁处理了。每一个责任链
* 的执行者都会有下一个执行者,直至请求被处理了。