前言:本篇系看完《研磨设计模式》一书的个人理解和总结,可能存在不正确的地方,看时需要持怀疑态度。另外,所有的图都是示意图,示意,示。
命令模式(Commad):
几点解释:
- 命令模式中分为三个角色:Invoker、Commad、Receiver。客户端调用Invoker,Invoker持有Commad对象并转调其对应方法,而Commad持有Receiver对象并转调其对应方法。因此这三层之间可以灵活的组合使用。
- 简化的命令模式,可以让Commad对象实现具体的功能,不同的Commad实现对应了不同的命令。Invoker可以不持有Commad对象,而是通过传参的方式来获得一个Commad对象。再进一步,传入Commad参数时可以使用匿名内部类的方式传入,类似于Java的回调模式。
- 上面说了命令模式可以退化为Java的回调实现,而回调方式是实现模板方法模式的一种方式,也即命令模式可以实现类似模板方法模式的功能:在Invoker中固定对应的算法骨架,需要子类参与的步骤通过传参来获得。
- 本质:将请求封装为一个个的命令。以命令对象为单位之后,实现日志、撤销、队列等功能就很容易。
- 多个命令可以组合为一个宏命令,类似组合模式。很容易联想到事务的实现,事务对应了一组命令,执行完一个命令,就从待执行日志中删除对应命令,并生成一个反操作放入 UndoLog中,当发生错误需要回滚时,就执行对应的UndoLog的对应的反操作就实现了回滚。
迭代器模式(Iterator):
几点解释:
- 迭代器模式要解决的问题是 对于多个内部实现不同的容器,给出一种统一的方式来访问容器内的元素。
- 之前是客户端直接访问容器对象,对不同的容器需要用不同的方式访问。现在,迭代器屏蔽了访问不同容器的差异,并对外提供了统一的访问方式,也就是把对不同容器的访问工作抽离封装到了迭代器中。
- 因为迭代器需要访问到容器中的元素,比较合适的方式即 将迭代器的具体实现作为容器类的一个 私有内部类,私有内部类会持有外部类实例的一个引用,然后在容器类中提供一个共有方法来返回对应的迭代器的实例即可。
- 本质:提供不同容器的一种通用的访问方式,也可以做一些访问控制。
- 和观察者模式一样,Java中也提供了迭代器模式的实现,大量的容器也都支持迭代器模式。
- 如果想要在迭代的同时进行元素的删除,可以使用容器的迭代器。