命令模式:
命令模式:将“请求”封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。
设计原则:
把方法的调用封装起来,调用此对象不需要知道它内部具体是如何运行的,只需要知道包装成型的方法
命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开
将“动作请求者”从“动作执行者”中解耦,即将发出请求的对象和接受并执行请求的对象分离开来。两者通过命令对象沟通
命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联
特点:
对象只知道通过接口暴露出execute()方法,当此方法调用时,接受者执行具体的动作。对象不知道那个接受者执行了什么动作,只知道操作进行了
NoCommand对象:execute()方法为空的对象,即不执行任何操作的对象。客户端处理null操作时交给空对象,而无需做if(command != null)操作。
撤销操作:在管理一组操作对象的对象中可以添加一个上一个操作的对象引用,用于追踪最后调用的命令,并通过命令的undo()方法实现撤销。同样在操作命令对象中也可添加局部变量记录上一个状态以实现undo()方法。
可使用堆栈记录操作过程中的每一个命令,实现多次撤销
宏命令:同时执行多个命令,软编码,传入命令数组,动态决定哪些命令
日志请求:使用命令模式的记录日志,我们可以将上个检查点之后的操作都记录下来,如果系统出现问题,从检查点开始执行命令
队列请求:把一组命令放到队列(先进先出)中,线程从队列中一个一个删除命令,然后调用它的excecute()方法。
适配器模式:
设计:
实现想要转换的接口
取得要适配的对象的引用,作为局部变量
用要适配的对象的方法实现接口中的方法
客户使用适配器的过程:
通过目标接口调用适配器方法
适配器使用被适配者的接口转换成对被适配者的调用
客户端接受调用结果,但并未察觉适配器在中转的作用
特点:
将类的接口转换成想要的接口,以便实现不同的接口,符合用户的期望
适配器实现了目标接口,并持有被适配者的实例
客户与适配器是解耦的
可以通过实现双边的接口设计双向的适配器
使用对象的组合,被适配者的子类也可以搭配适配器使用
外观模式:
特点:
将一个或多个类的复杂的一切隐藏在背后,只露出一个干净美好的外观
通过提供一个有着更合理接口的外观类,将复杂的子系统变得容易操作
外观只是提供了一些简化的操作,没有把子系统的高级操作隔离起来,依然将子系统完整的暴露出来,因此也可以访问子系统的接口
外观并没有实现新的行为,只是将子系统的操作合理的组合
一个子系统可以有多个外观,并可以创造分层次的外观
优点:
外观不只简化了接口,也将用户从复杂的子系统中解耦出来
外观vs适配器:
外观的目的是简化接口,适配器的目的是转换接口
“最少知识”原则:不要让太多的类耦合在一起以至于修改系统中的一部分会影响到其他部分
我们可以调用的方法:
该对象本身
被当作方法参数传进来
此方法中所创建的对象实例
对象的任何组件
网友评论