第6章 模板方法模式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

设计模式第六章模板方法模式设计模式2回顾掌握适配器模式,当需要使用一个现有的类而其接口并不符合需要时掌握适配器模式的结构与使用学会使用双向适配器,单接口适配器掌握外观模式以及与适配器模式比较利用模式和原则设计简单应用程序设计模式3目标模板方法定义了算法的步骤,把这些步骤的实现延迟到子类模板方法模式为我们提供一种代码复用的重要技巧模板方法的抽象类可以定义具体方法、抽象方法和HookHook是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。设计模式4举例Starbucks咖啡和茶冲泡方法咖啡冲泡法:⑴把水煮沸⑵用沸水冲泡咖啡⑶把咖啡倒进杯子⑷加糖和牛奶茶冲泡法:⑴把水煮沸⑵用沸水冲泡茶叶⑶把茶叶倒进杯子⑷加柠檬咖啡和茶的冲泡方法大致上一样。我们将共同的部分抽取出来,放进一个基类中。①把水煮沸②用沸水冲泡饮料(咖啡或茶)③把饮料(咖啡或茶)倒进杯子④在饮料(咖啡或茶)内加入适当的调料设计模式5怎样解决-1该方法用来处理咖啡和茶。其被声明为final,因为不希望子类覆盖这个方法。因为咖啡和叉处理这两个做法不同,所以这两个方法被声明为抽象,留给子类去具体实现。设计模式6解决2这两个子类继承自CaffeineBeverage:将一些步骤依赖子类进行设计模式7认识模板方法这就是模板方法,因为:①它是一个方法;②它用作一个算法的模板;③在这个模板中,算法内的每一个步骤都被一个方法代表了;④某些方法由子类来处理;⑤需要由子类提供的方法,必须在超类中声明为抽象模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现!设计模式8运行特点:①由CaffeineBeverage类主导一切,它拥有算法,而且保护这个算法;②对子类来说,CaffeineBeverage类的存在,可以将代码的复用最大化;③算法只存在于一个地方,所以容易修改;④这个模板方法提供一个框架,可以让其它相同冲泡法的饮料插进来,只需实现自己的方法就可以了;⑤CaffineBeverage类专注算法本身,由子类提供完整的实现。设计模式9定义模板方法模式定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使的子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模式的结构:包括两种角色①抽象模板:是一个抽象类,它包含了一个算法骨架称为模板方法;该算法中每一步骤可以由抽象方法(原语操作)与非抽象方法实现。抽象方法由其子类完成。②具体模板:它是抽象模板的子类,实现抽象模板中的原语操作AbstractTemplatetemplateMethod():voidprimitiveOperation1():voidprimitiveOperation2():voidConcreteTemplate1primitiveOperation1():voidprimitiveOperation2():voidConcreteTemplate2primitiveOperation1():voidprimitiveOperation2():voidvoidtemplateMethod(){primitiveOperation1():voidprimitiveOperation2():void}设计模式10对模板方法进行挂钩Hook方法:钩子是一种被声明在抽象类中的具体方法,但只有空的或默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定要不要覆盖Hook。钩子方法设计模式11举例根据顾客要求,其饮料是否要添加进调料重写钩子方法设计模式12运行设计模式13模板方法模式特点适用当你的子类必须提供算法中某个方法或步骤的实现时,就使用抽象方法。如果算法的这个部分是可选的,就用钩子。①可以通过在抽象模板定义模板方法给出成熟的算法步骤;②具体模板实现算法细节不会改变整个算法的骨架;③在抽象模板模式中,可以通过Hook方法对某些步骤进行挂钩,具体模板通过钩子可以选择算法骨架中的某些步骤。设计模式14用模板方法排序利用数组的排序模板方法将一组Duck数组按照重量排序publicstaticvoidsort(Object[]a){Objectaux[]=(Object[])a.clone();mergeSort(aux,a,0,a.length,0);}privatestaticvoidmergeSort(Objectsrc[],Objectdesc[],intlow,inthigh,intoff){for(inti=low;ihigh;i++){for(intj=i;jlow&&(Comparable)dest[j-1]).compareTo((Comparable)dest[j])0;j--){swap(dest,j,j-1);}return;}模板方法具体方法,已经在数组类中定义我们需要实现compareTo()方法,填补模板方法的缺憾设计模式15代码设计模式16运行设计模式17利用Hook写Swing窗口程序JFrame的更新算法update()中,利用覆盖paint()钩子方法和这个算法挂上钩。在默认情况下,paint()是不做事的,只是一个Hook设计模式18运行因为利用了paint()钩子方法,所以可以显示出这样的消息。设计模式19注意为防止子类改变模板方法中的算法,可以将模板方法声明为final。将决策权放在高层模块中,以便决定如何以及何时调用低层模块。工厂方法是模板方法的一种特殊版本。设计模式20总结模板方法定义了算法的步骤,把这些步骤的实现延迟到子类模板方法模式为我们提供一种代码复用的重要技巧模板方法的抽象类可以定义具体方法、抽象方法和HookHook是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功