永久地址✅✅gdsbet.com✅✅
威廉希尔 德国 加纳 吓得姚建才忙跑后了几步,“悠着点啊兄弟。
老妈传话道:“你爸让你回来。
王蓓看他虽然没有直接答应,但也很满意了,毕竟今天董杉杉求他们帮张烨代言一下的时候,王蓓当时犹豫了一下也没有站出来,这会儿开口反倒是她有点唐突,不过女人嘛,总是比男人要多一点点唐突的资格,同事关系也是可以慢慢发展的,吃几次饭大家就熟悉了。以下为本人写的其他设计模式,感兴趣的同学可以查阅。
白话设计模式之菜鸟提升篇
此头条号中已经发布了其他设计模式,感兴趣的同学可以关注我后进行查阅,同时获取后序更多模式及其他信息。
命令模式(command pattern)
将一个请求封装为一个对象,可让请求变得灵活(请求对象参数化),同时将请求者和请求接收者解耦。比如,a对象想调用b对象的某个方法,那么a对象必然需要依赖b对象;使用命令模式的话就类似抽取出一个公共地方(请求对象),a依赖请求对象,a只需调用请求对象的方法,然后由请求对象调用b对象的方法,这样a和b就成功的解耦了;请求者无需关心接收者是谁,只需要维护好请求对象即可,需要变更接收者时只需跟换请求对象即可,这样使得系统易扩展,也符合开放闭合原则。命令模式整体的一个基本结构如下图所示:
命令模式结构
模式案例解析
这里我们以事物的提交和回滚为例来解说命令模式;为一个insert方法增加事物,如果没有出现异常则事物提交,否则事物回滚,针对的是事物的提交和回滚操作,我们把事物当做是一个请求对象(command),把具体实现数据库事物提交和回滚的对象作为接收者(receiver),把insert这个方法的对象作为请求发起者(invoke);具体类结构图如下所示:
命令模式
command(抽象命令对象):它是命令对象的抽象(父类),可以是接口、抽象类或者普通类(案例中使用接口),它定义了一组命令对象的统一业务接口方法;这里定义了execut()(命令执行方法:案例中表示事务提交),undo()(命令撤销方法:案例中表示事务回滚)。具体代码片段如下所示:
抽象命令对象
transactionalcommand(具体命令对象):它实现了抽象命令对象的方法,同时拥有一个命令接收者(transactionalreceiver)的引用,在execut和undo方法中分别调用命令接收者的方法。具体代码片段如下所示:
具体命令对象
transactionalreceiver(接收者对象):实现具体命令对应的业务方法。具体代码片段如下所示:
接收者对象
datadao(业务数据操作对象:请求调用者):它是具体请求的调用者,拥有了一个命令对象(command)的引用,在insert方法中实现了对应命令方法的调用(提交事务、回滚事务)。具体代码片段如下所示:
请求调用者
client(客户端测试):具体代码片段如下所示:
客户端测试
扩展
命令队列:当一个请求对应多个接收者时,可以使用命令对象形式来实现。就是增加一个命令队列的对象,请求调用者不在依赖请求对象,而是依赖于命令对象队列,命令对象队列中维护了一个保护抽象请求对象(命令对象)的集合,在命令对象队列中通过循环抽象命令集合进行接收者调用。
撤销操作:在命令模式中,我们可以通过调用一个命令对象的execute()方法来实现对请求的处理,如果需要撤销(undo)请求,可通过在命令类中增加一个逆向操作来实现。
总结
优点
降低系统的耦合度(请求者和接收者解耦)
容易进行新命令的增加(易扩展),而不需要修改原代码,符合开发闭合原则
缺点
系统中可能需要提供大量的具体命令类,这将影响命令模式的使用
今天就先写到这里,如有问题,欢迎吐槽。在此特别感谢design-pattern-java一书的作者,是他让我开始对设计模式产生了感觉。地球不爆炸,我们不放假,good good study day day up !!如有帮助请多多关注!点赞
董杉杉看看他,“服装你会挑?”
但是现在,张烨却有点危机感了,觉得这十几本太极技能有些不够看了。
| | |
国家税务总局办公厅主办 电子税务管理中心凯发一触即发的技术支持
凯发一触即发的版权所有:国家税务总局 京icp备13021685号-2 地址:北京市海淀区羊坊店西路5号 邮编:100038 |