java设计模式学习笔记——扩展型模式1

       在扩展对象行为和功能的时候,常常需要遵循两个原则,LSP替换原则和迪米特法则。LSP的主要思想是一个类的实例应该具有父类的所有功能,迪米特法则要求每个方法只能给有限的对象发消息,包括参数变量、this伪变量,以及this的直接子部分。

       可以使用设计模式来扩展类或者对象的行为。比如适配器模式,通过实现预先设计的接口来完成功能;命令模式,通过对象中封装的方法,并且在适合的时机来调用;解释器模式,允许在运行时组合可执行对象的工具集,从类的层次结构进行扩展;模板方法模式,父类提供方法,要求子类实现其中的一些步骤。还有像是代理模式,观察者模式,桥接模式也可以进行扩展。感觉上述模式基本上要么实现预定义的接口,要么继承父类实现方法来实现扩展性的,需要在实践中慢慢体会不同模式之间的差别吧。

       装饰器模式和解释器模式比较相似,都是在运行时进行组合,但是解释器是将可执行的对象进行组合,在某些情况下,需要对象的行为发生微小的变化,就需要用装饰器模式组合操作的新变化。在装饰器模式中,类通常需要后继装饰器对象的构造函数。比较经典的范例是java的输入输出流设计,创建一个可组合的输出流工具箱,可以针对不同的输出要求进行处理。下图展示了过滤器类的层次结构:

java设计模式学习笔记——扩展型模式1_第1张图片

       过滤器类需要接收一个Writer对象作为其构造函数参数,并实现自己的write(c: int)方法,该方法最后需要调用Writer对象的write方法。通俗点说,就是当前过滤器进行第一层装饰后,把工作丢给后继过滤器,构造函数参数就是后继过滤器。

java设计模式学习笔记——扩展型模式1_第2张图片

       解释器模式和访问者模式都是基于合成模式(定义一个公共接口,该接口用于单个对象或者复合对象)的,解释器根据创建的类层次结构来组合可执行对象,而访问者模式的意图是在不改变类层次结构的前提下,对层次结构进行扩展。

       下图MachineComponent通过增加accept方法,使其支持访问者模式。MachineComponent类的accept方法是一个抽象方法,每个子类对该方法的实现几乎完全相同,即调用访问者的visit方法。但是在编译器看来,完全相同的代码其实并不相同,因为访问者会根据传入的不同参数类型寻找相应的visit方法。

java设计模式学习笔记——扩展型模式1_第3张图片

      下面创建一个FindVisitor类来说明访问者模式是如何工作的。

java设计模式学习笔记——扩展型模式1_第4张图片

java设计模式学习笔记——扩展型模式1_第5张图片

      find方法并不关心接收到的MachineComponent对象到底是什么类型的,该方法只是简单的调用accept方法,在accept方法内会调用访问者的visit方法。visit方法内同样不关心它的自组件的实例是什么类型,只是委派给组件accept方法,最后accept方法再委派给访问者的visit方法。这种技术被称为双重委派(是不是有点像是合成迭代器,递归)。

java设计模式学习笔记——扩展型模式1_第6张图片

你可能感兴趣的:(java)