设计模式举例-行为型

行为类型设计模式

行为设计模式都是解决事件命令传播和状态方面的模式,如状态模式处理单据因为类型和状态而导致的GUI显示多样性,命令模式解决菜单命令的分发。

 

观察者模式(Observer):是一种广泛使用的模式,很多GUI事件的分发都使用了这个模式,如Swing当中鼠标事件的分发使用了MouseListener,定义了监听接口函数和事件,还有监听的注册和注销机制。其它的GUI处理框架,如安卓,IOS也有类似的实现,JS框架也有相关的处理机制。适配器起模式常常和观察者模式一起使用,如Swing的MouseAdaptor。

 

Command(命令模式):用来处理命令的分发,如果不使用这个模式,命令分发可能会变成大段大段的if-else-if-else-if,使用这个设计模式让软件结构清晰,扩展性非常好,下面举一个应用的例子,Swing的工具栏事件处理。

对应的Command模式代码实现

如果没有设计模式,代码会变成如下:

使用Command设计模式另外一个好处就是可以集中化处理一些事务,如日志,异常错误的处理等等,而且通用的业务逻辑也可以放到这里。

 

Visitor(访问者模式):访问者模式一般是访问一个数据结构,并且对这些数据结构的成员执行一些操作,具体的操作由访问者来实现,具体案例就是和组合模式混用的GUI绘制流程。

java.awt.Graphics就是访问者抽象类,java.awt.Graphics2D也是抽象类,是Vistor功能进一步扩展,具体的实现类没有出现在API当中,是对使用者隐藏的。把组合模式和访问者模式结合起来使用,让结构坐标计算和具体的绘制功能实现解耦,独立演化。例如,用户可能会重载坐标尺寸计算部分的功能,调整Vistor的调用逻辑,但这些都不会影响到具体的绘制过程的实现代码。

 

State(状态模式):状态模式是一个非常有用的模式,是If-Else面条代码的必杀技,下面讲解一个订单列表的应用场景,用来处理订单多类型和多状态的展示。

状态模式和策略模式比较容易混,其实两者的运用场景有很大区别,状态模式表达了一个对象的状态,为不同状态提供不同的展示,多用于GUI的场景,而策略模式多用于逻辑计算场景,使用的场景非常不同。

 

Strategy(策略模式:策略模式多用于业务逻辑计算的场景,例如:POS系统里面的零售订单折扣计算,因为商家可能会提供很多种折扣促销方案,不同的折扣方案有不同的使用对象或者使用时间,也就是说零售单据会有多个策略,根据情况动态的决定使用的策略。测试模式也是一个非常好的IF-ELSE面条代码的必杀技。

所有的零售折扣策略都实现了相同的接口,调用函数可以根据传入的零售订单order对象的情况决定执行哪种折扣策略,折扣策略有几十种,但没有IF-ELSE的判断语句出现。

 

Chain of Responsibility(责任链模式):责任链可以看作是一系列的生产线,传递的东西就是需要操作的产品,运用场景:Struts2和SpringMVC中的Interceptor的设计,如下图:

运用了责任链模式,用户可以自由配置这些interceptor,客户化自己的处理流程,比如加入日志处理和登陆验证处理等等,让框架功能变得容易扩展。

 

Template Method(模板方法模式):模板方法是一个高频率使用的设计模式,例如,多个类有部分相同的处理流程,这时候最好使用模板方法模式,把相同的处理逻辑抽象归纳到基类里面,同时声明一个protected方法,子类可以重载,实现自己个性化的处理流程,举一个单据CRUD的例子,大型DRP系统又很多单据需要CRUD。

使用模板方法模式的最大优势就是相同处理代码可以放到基类,实现代码最大程度的重用,而且集中化的代码让后期维护,日志,性能检测变得简单。如果不使用这个模式,如果单据保存流程调整了,你可能需要修改几十个地方,使用了这个模式,你只需要修改一个地方,生产效率是几十倍的提升。而且开发阶段,一个人写这部分代码,大家都可以享受成果,避免团队重复造轮子。

 

Mediator(中介模式):中介模式的作用就是给N个对象之间的调用进行解耦处理,大家都依赖中介,而且之间是解耦的,可以独立变化,如下图:

应用案例有我在美国做的物流枢纽平台,案例介绍请参看”软件框架设计实例_解析”,还有阿里的数据库传输工具DataX,如下图:

 

Memento(备忘录模式):备忘录模式用户对象的状态恢复,就和对象的快照一样,应用场景:APP数据的编辑提交保存,如果提交服务器失败(可以是多次重试后都失败),则需要恢复之前的数据,所以在开启数据编辑之前最好做个数据快照,有了这个快照也可以感知数据是变化,如果用户没有修改直接退出,就可以不做保存提示,提升APP的用户体验。怎么样高效的实现这个模式也是非常讲究的,数据模型一大堆,如果每个都去实现费时费力,最好的办法就是利用JAVA的反射机制在基类里面实现。

Interpreter(解析器模式):使用场景很少,用于语言语法的解析,如计算器的四则运算语法解析,需要用到抽象语法树,网上讲解比较多,这里不多讲述。

 

Iterator(迭代器模式):使用场景比较单一,提供数据结构元素的顺序访问,例如JAVA的List就实现该设计模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值