首页 > 技术文章 > 设计模式之笔记

IT-study 2019-10-28 21:37 原文

 

设计模式—策略模式

定义:定义一系列的算法,将算法进行封装、隔离、相互独立、又能相互替换
使用场景:第三方支付方式选择、底层多套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); 获取当前责任对象并处理请求。
 *
 * 总结:责任链的执行过程对外是不可见的。对于用户来说只知道请求被处理了,而不知道被谁处理了。每一个责任链
 * 的执行者都会有下一个执行者,直至请求被处理了。

 

推荐阅读