前言:本篇系看完《研磨设计模式》一书的个人理解和总结,可能存在不正确的地方,看时需要持怀疑态度。另外,所有的图都是示意图,示意,示。
组合模式(Composite):
几点解释:
- 树形结构中有叶子节点,组合节点(包含其他节点),组合模式通过抽象出一个高层的父类,来对外提供统一的外观。这样,客户端就可以使用同一个引用类型来操作不同的节点对象。抽象父类中集合了所有类型的子类节点所需要的功能,大多数功能都会提供默认实现,一般是抛出不支持此操作的异常。子类继承时按需实现特定的方法即可。
- 我们写的Java程序,在编译的时候,通过词法分析会得到一颗语法树,接下来的工作就是要遍历这颗语法树进行语法分析和语义分析。这颗语法树可以使用组合模式来实现,这样就可以以统一的方式来操作了。
- 使用组合模式可以构建出外观统一的树形结构,有的时候我们会遍历这个树形结构,此时要注意的问题是 树形结构中可能会出现环,从而导致死循环的出现。导致环的原因在于同一个对象在这个树形结构中出现了两次,一个可行的解决方法在于添加对象时先检查下这个对象之前是否添加过。
模板方法模式(TemplateMethod):
几点解释:
- 模板方法模式的目的在于将算法骨架固定下来,并在固定的点通过抽象方法的方式给子类提供扩展的机会。
- 除了继承并实现抽象方法的方式外,也可以通过Java回调实现模板方法模式,即通过传入匿名内部类对象的形式,将具体的步骤传入进来
- java.util.concurrent包中的 AQS类,即是通过继承抽象类方式实现模板方法模式;Collections.sort(list, new Comparator<Object>() {})方法,即是通过传入回调的方式实现了模板方法模式。
- 咋一看结构其实很像工厂方法模式,同样是抽象方法,由子类实现,并且抽象方法一般服务于内部,但是 二者的目的不同:工厂方法模式的抽象方法需要子类来选择一个具体的实现来返回,目的在于选择并创建具体的对象实例,而模板方法模式的抽象方法是具体算法中的一些小的步骤,一般会返回原始类型的值,用来决定算法的下一步走向之类的。