-
模式的秘密---模板方法模式——总结 一、模板方法模式的实现要素: 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。 二、从类的角度看: (1)抽象基类 1、基本方法。 2、抽象方法【只知道具体原则,而不知道实现细节,需要将其延迟到子类中实现的一些步骤】。 3、可选钩子(Hook,钩子函数,提供一个默认或空的实现。具体的子类可以自行决定是否挂钩以及如何挂钩)。 4、Template方法(final 使其不能被子类所覆写 模板方法模式要遵循的原则:子类可以替换掉父类中的可变逻辑,但不能改变整体逻辑结构))。 (2)具体子类 1、实现基类中的抽象方法。 2、覆盖钩子方法。 三、模板方法的优点: (1)封装性好。 (2)复用性好。 (3)屏蔽细节。 (4)便于维护。 四、模板方法的缺点: (1)继承限制(Java语言是单继承语言),单继承会使得更多情况不可用,新类引入困难。 五、模板方法模式的适用场景: (1)算法或操作遵循相似的逻辑。 (2)重构时(把相同的代码抽取到父类中)。 (3)重要、复杂的算法,核心算法设计为模板方法。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
package com.imooc.pattern.template; /* * 具体子类,提供了制备茶的具体实现 */ public class Tea extends RefreshBeverage { @Override protected void brew() { System.out.println("用80度的热水浸泡茶叶5分钟"); } @Override protected void addCondiments() { System.out.println("加入柠檬"); } @Override /* * 子类通过覆盖的形式选择挂载钩子函数 * @see com.imooc.pattern.template.RefreshBeverage#isCustomerWantsCondiments() */ protected boolean isCustomerWantsCondiments() { return false; } } 运行结果: 制备咖啡…… 将水煮沸 用沸水冲泡咖啡 饮料倒入杯中 加入糖和牛奶 咖啡好了! ********************* 制备茶…… 将水煮沸 用80度的热水浸泡茶叶5分钟 饮料倒入杯中 茶好了!查看全部
-
模式的秘密---模板方法模式——代码实现 I 1、RefreshBeverage.java /* * 抽象基类,为所有子类提供一个算法框架 * 提神饮料 */ public abstract class RefreshBeverage { /* * 制备饮料的模板方法 * 封装了所有子类共同遵循的算法框架 */ public final void prepareBeverageTemplate(){ //步骤1 将水煮沸 boilWater(); //步骤2 泡制饮料 brew(); //步骤3 将饮料倒入杯中 pourInCup(); if(isCustomerWantsCondiments()){ //步骤4 加入调味料 addCondiments(); } } /* * Hook, 钩子函数,提供一个默认或空的实现 * 具体的子类可以自行决定是否挂钩以及如何挂钩 * 询问用户是否加入调料 */ protected boolean isCustomerWantsCondiments() { return true; } /* * 基本方法,将水煮沸 */ private void boilWater() { System.out.println("将水煮沸"); } /* * 基本方法,将饮料倒入杯中 */ private void pourInCup() { System.out.println("将饮料倒入杯中"); } /* * 抽象的基本方法,泡制饮料 */ protected abstract void brew(); /* * 抽象的基本方法, 加入调味料 */ protected abstract void addCondiments(); } ... 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
package com.imooc.pattern.template; public class RefreshBeverageTest { public static void main(String[] args) { System.out.println("制备咖啡……"); RefreshBeverage b1 = new Coffee(); b1.prepareBeverageTemplate(); System.out.println("咖啡好了!"); System.out.println("\n*********************"); System.out.println("制备茶……"); RefreshBeverage b2 = new Tea(); b2.prepareBeverageTemplate(); System.out.println("茶好了!"); } } 运行结果: 制备咖啡…… 将水煮沸 用沸水冲泡咖啡 饮料倒入杯中 加入糖和牛奶 咖啡好了! ********************* 制备茶…… 将水煮沸 饮料倒入杯中 茶好了!查看全部
-
package com.imooc.pattern.template; public class RefreshBeverageTest { public static void main(String[] args) { System.out.println("制备咖啡……"); RefreshBeverage b1 = new Coffee(); b1.prepareBeverageTemplate(); System.out.println("咖啡好了!"); } } 输出结果: 制备咖啡…… 将水煮沸 用沸水冲泡咖啡 饮料倒入杯中 加入糖和牛奶 咖啡好了!查看全部
-
package com.imooc.pattern.template; /* * 抽象基类,为所有子类提供一个算法框架 * * 提神饮料 */ public abstract class RefreshBeverage { /* * 制备饮料的模板方法 * 封装了所有子类共同遵循的算法框架 */ public final void prepareBeverageTemplate(){ // 步骤1.将水煮沸 boilWater(); // 步骤2.泡制饮料 brew(); // 步骤3.将饮料倒入杯中 pourInCup(); // 步骤4. 加入调味料 addCondiments(); } /* * 基本方法,将水煮沸 */ private void boilWater() { System.out.println("将水煮沸"); } /* * 抽象的基本方法,泡制饮料 */ protected abstract void brew(); /* * 基本方法,将饮料倒入杯中 */ private void pourInCup() { System.out.println("饮料倒入杯中"); } /* * 抽象的基本方法,加入调味料 */ protected abstract void addCondiments(); }查看全部
-
每一次学习都是一次进步 模板模式 定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现, 使得子类在不改变一个算法结构的同时,就重新定义该算法的特定步骤.查看全部
-
模板方法的实现要素查看全部
-
模版方法实现要素查看全部
-
对模板方法中非共性的方法采用抽象类中的抽象方法,是因为有些方法在模板中确实不知道具体的实现,提供一个空的默认实现,再在子类中去override是多余的。再者,共性的部分采用private标识,对子类屏蔽了实现细节,让具体的子类只用关注它特有的个性方法实现。 这样整体结构更加清晰明了,各个类的职责也更加具体清楚。...查看全部
-
模式的秘密---模板方法模式——总结 一、模板方法模式的实现要素: 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。 二、从类的角度看: (1)抽象基类 1、基本方法。 2、抽象方法【只知道具体原则,而不知道实现细节,需要将其延迟到子类中实现的一些步骤】。 3、可选钩子(Hook,钩子函数,提供一个默认或空的实现。具体的子类可以自行决定是否挂钩以及如何挂钩)。 4、Template方法(final 使其不能被子类所覆写 模板方法模式要遵循的原则:子类可以替换掉父类中的可变逻辑,但不能改变整体逻辑结构))。 (2)具体子类 1、实现基类中的抽象方法。 2、覆盖钩子方法。 三、模板方法的优点: (1)封装性好。 (2)复用性好。 (3)屏蔽细节。 (4)便于维护。 四、模板方法的缺点: (1)继承限制(Java语言是单继承语言),单继承会使得更多情况不可用,新类引入困难。 五、模板方法模式的适用场景: (1)算法或操作遵循相似的逻辑。 (2)重构时(把相同的代码抽取到父类中)。 (3)重要、复杂的算法,核心算法设计为模板方法。查看全部
-
模板模式 定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现, 使得子类在不改变一个算法结构的同时,就重新定义该算法的特定步骤.查看全部
-
模板方法要求,声明的共同的方法为final,也就不让子类继承和破坏,子类可以替换掉父类中可变的逻辑,但是不能改变整体的逻辑结构,这个原则称之为好莱坞原则,也就是好莱坞的演员可以为娱乐公司提供一些业务,但是不能改变娱乐公司的运行规则。查看全部
-
模式的秘密---模板方法模式——总结 一、模板方法模式的实现要素: 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。 二、从类的角度看: (1)抽象基类 1、基本方法。 2、抽象方法【只知道具体原则,而不知道实现细节,需要将其延迟到子类中实现的一些步骤】。 3、可选钩子(Hook,钩子函数,提供一个默认或空的实现。具体的子类可以自行决定是否挂钩以及如何挂钩)。 4、Template方法(final 使其不能被子类所覆写 模板方法模式要遵循的原则:子类可以替换掉父类中的可变逻辑,但不能改变整体逻辑结构))。 (2)具体子类 1、实现基类中的抽象方法。 2、覆盖钩子方法。 三、模板方法的优点: (1)封装性好。 (2)复用性好。 (3)屏蔽细节。 (4)便于维护。 四、模板方法的缺点: (1)继承限制(Java语言是单继承语言),单继承会使得更多情况不可用,新类引入困难。 五、模板方法模式的适用场景: (1)算法或操作遵循相似的逻辑。 (2)重构时(把相同的代码抽取到父类中)。 (3)重要、复杂的算法,核心算法设计为模板方法。查看全部
-
模式的秘密---模板方法模式——总结 一、模板方法模式的实现要素: 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。 二、从类的角度看: (1)抽象基类 1、基本方法。 2、抽象方法【只知道具体原则,而不知道实现细节,需要将其延迟到子类中实现的一些步骤】。 3、可选钩子(Hook,钩子函数,提供一个默认或空的实现。具体的子类可以自行决定是否挂钩以及如何挂钩)。 4、Template方法(final 使其不能被子类所覆写 模板方法模式要遵循的原则:子类可以替换掉父类中的可变逻辑,但不能改变整体逻辑结构))。 (2)具体子类 1、实现基类中的抽象方法。 2、覆盖钩子方法。 三、模板方法的优点: (1)封装性好。 (2)复用性好。 (3)屏蔽细节。 (4)便于维护。 四、模板方法的缺点: (1)继承限制(Java语言是单继承语言),单继承会使得更多情况不可用,新类引入困难。 五、模板方法模式的适用场景: (1)算法或操作遵循相似的逻辑。 (2)重构时(把相同的代码抽取到父类中)。 (3)重要、复杂的算法,核心算法设计为模板方法。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
举报
0/150
提交
取消