关键词 :hook 钩子 Applet 中 init() destory() 为钩子,需要子类去实现。
新原则: 别调用我们,我们会调用你们 高层调用低层 低层不能调用高层。
目的 :封装算法
模板方法:子类决定如何实现算法中的步骤
策略:封装可互换的行为,然后使用委托来决定要采用哪一个行为
工厂方法:由子类决定实例化哪个具体类
OO原则:新原则上面
OO模式:模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类。模板方法使得子类可以在不改变算法的结构的情况下,重新定义算法中的某些步骤。
//对模板方法进行挂钩
钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类决定。
钩子可以做为条件控制语句,影响抽象类中的算法流程。
钩子的另一个用法,是让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤作出反应。
新原则和依赖倒置原则:依赖倒置原则教我们尽量避免使用具休类,而多使用抽象类。
新原则是用在创建框架或组件上的一种技巧,好让低层组件能够被挂钩进计算中,而且又不会让高层组件依赖低层组件。两者的目标都是在于解耦。
JavaAPI 中的 模板方法
Arrays.Sort()
Java数组类的设计者提供一个模板方法用来排序。 下面是简化代码
数组无法继承,所以如何使用sort() ?
sort()的设计者希望这个方法能用于所有的数组,所以把sort()变成静态的方法,这样任何数组都能使用这个方法。
因为sort()并不是真正定义在超类中,所以sort()方法需要知道你已经实现了这个compareTo()方法,否则无法进行排序。
所以数组中要排序的对象需要实现 Comparable接口。
例子: 比较鸭子
开始排序
要点:
(1)“模板方法”定义了算法的步骤,把这些步骤的实现延迟到子类
(2)模板方法模式为我们提供了一种代码复用的重要技巧。
(3)模板方法的抽象类可以定义具体方法,抽象方法和钩子。
(4)抽象方法由子类实现。
(5)钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。
(6)为了防止子类改变模板方法中的算法,可以将模板方法声明为final
(7)好莱坞原则告诉我们,将决策权放在高层模块中,以便决定如何以及何时调用低层模块。
(8)你将在真实世界代码中看到模板方法模式的许多变体,不要期待它们全都是一眼就可以被你认出的。
(9)策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
(10)工厂方法是模板方法的一种特殊版本。
策略VS 模板
策略:我定义一个算法家族,并让这些算法可以互换。正因为每一个算法都被封装起来了,所以客户可以轻易地使用不同的算法。
模板:我定义一个算法大钢,而由我的子类定义其中某些步骤可以有不同的实现细节。但是我的算法结构依然维持不变。
模板依赖性高一些,必须依赖超类中算法的实现,因为这是算法的一部分。
策略不依赖任何,整个算法自己搞定。