设计模式八之模板方法模式1

  封装算法块,好让子类可以在任何时候都可以将自己挂接进运算里。

  模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中得某些步骤。

  这个模式是用来创建一个算法的模板。什么是模板?如你所见的,模板就是一个方法。更具体地说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。

  钩子是一种被声明在抽象类中的方法,但只有空得或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类决定。钩子有几种用法。如我们之前所说得,钩子可以让子类实现算法中可选的部分,或者在钩子对于子类的实现并不重要的时候,子类可以对钩子置之不理。钩子的另一个用法,是让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤作出反应。比方说,名为justReOrderedList()的钩子方法允许子类在内部列表重新组织后执行某些动作(例如在屏幕上重新显示数据)。正如你刚刚看到的,钩子也可以让子类有能力为其抽象类做一些决定。在写模板方法时候,算法内的步骤不要切割的太细,但是如果步骤太少的话,会比较没有弹性,所以要看情况折衷。也请记住,某些步骤是可选的,所以可以将这些步骤实现成钩子,而不是实现成抽象方法,这样就可以让抽象类的子类的负荷减轻。

  有一个原则,好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。

  好莱坞原则可以给我们一种防止依赖腐败的方法。当高层组件依赖底层组件,而底层组件又依赖高层组件,高层组件又依赖边侧组件,而边侧组件又依赖底层组件时,依赖腐败就发生了。在这种情况下,没有人可以轻易地搞懂系统是如何设计的。

  在好莱坞原则之下,我们允许底层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些底层组件。换句话说,高层组件对待底层组件的方式是别调用我们,我们会调用你。

  好莱坞原则和模板方法之间的连接其实还算明显:当我们设计模板方法模式时,我们告诉子类,不要调用我们,我们会调用你。

 

posted @ 2015-12-27 00:18  likeshu  阅读(139)  评论(0编辑  收藏  举报