为了账号安全,请及时绑定邮箱和手机立即绑定
  • 模式的秘密---模板方法模式——代码实现 II 2、Tea.java /* * 具体子类,提供了制备茶的具体实现 */ public class Tea extends RefreshBeverage { @Override protected void brew() { System.out.println("用80度的热水浸泡茶叶5分钟"); } @Override protected void addCondiments() { System.out.println("加入柠檬"); } @Override /* * 子类通过覆盖的形式选择挂载钩子函数 */ protected boolean isCustomerWantsCondiments(){ return false; } } 3、Coffee.java /* * 具体子类,提供了咖啡制备的具体实现 */ public class Coffee extends RefreshBeverage { @Override protected void brew() { System.out.println("用沸水冲泡咖啡"); } @Override protected void addCondiments() { System.out.println("加入糖和牛奶"); } } 4、RefreshBeverageTest.java public class RefreshBeverageTest { public static void main(String[] args) { System.out.println("制备咖啡..."); RefreshBeverage b1 = new Coffee(); b1.prepareBeverageTemplate(); System.out.println("咖啡好了!"); System.out.println("制备茶..."); RefreshBeverage b2 = new Tea(); b2.prepareBeverageTemplate(); System.out.println("茶好了!"); } } Ps:注意钩子方法的使用。
    查看全部
  • 模式的秘密---模板方法模式——代码实现 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等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 模式的秘密---模板方法模式——生活案例——饮料的调制方法 II 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 模式的秘密---模板方法模式——生活案例——饮料的调制方法 I 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 模式的秘密---模板方法模式——生活案例 II 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 模式的秘密---模板方法模式——生活案例 I 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 模板方法模式的实现要素: 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。 从类的角度看: (1)抽象基类 1、基本方法 2、抽象方法【只知道具体原则,而不知道实现细节,需要将其延迟到子类中实现的一些步骤】 3、可选钩子(Hook,钩子函数,提供一个默认或空的实现。具体的子类可以自行决定是否挂钩以及如何挂钩) 4、Template方法(final 使其不能被子类所覆写 模板方法模式要遵循的原则: 子类可以替换掉父类中的可变逻辑,但不能改变整体逻辑结构)) (2)具体子类 1、实现基类中的抽象方法 2、覆盖钩子方法 模板方法的优点: (1)封装性好 (2)复用性好 (3)屏蔽细节 (4)便于维护 模板方法的缺点: (1)继承限制(Java语言是单继承语言) 单继承会使得更多情况不可用,新类引入困难。 模板方法模式的适用场景: (1)算法或操作遵循相似的逻辑 (2)重构时(把相同的代码抽取到父类中) (3)重要、复杂的算法,核心算法设计为模板方法
    查看全部
  • 模版方法模式的使用场景: 1.算法或操作遵循相似的逻辑. 2.重构时(把相同的代码抽象到父类中) 3.重要、复杂的算法,核心算法设计为模版算法. 模版方法模式的优缺点: 优点: 1.封装性好 2.复用性好 3.屏蔽细节 4.便于维护 缺点:需要使用继承,因为java是单继承,一个类只能继承一个类.
    查看全部
  • 该模版方法规定了4个步骤: 1.把水煮沸(boilWater) 2.泡饮料(brew) 3.把饮料倒进杯子(pourInCup) 4.加调味料(addCondiments) 有个问题是该模块方法会使得每种饮料都要加入调料,但有些人却不需要加入任何调料. 是因为在模块方法中把步骤规定得太死,因此不能做到个性化的扩展,此时可以加入钩子方法来解决此问题. 钩子方法:提供一个默认或空的实现,具体的子类可以自行决定是否挂钩以及如何挂钩,即子类可以选择重写该钩子方法(挂钩). 使用钩子方法可以轻松实现个性化设置. public final void prepareBeverageTemplage(){ //将水煮沸 boilWater(); //炮制饮料 brew(); //倒入杯中 pourInCup(); //如果用户需要加入配料则加入. if( isCustomerWantsCondiments() ){ //加入调味料 addCondiments(); } } //钩子方法,用来询问客户是否需要加入配料,默认是返回true,即加入. protected boolean isCustomerWantsCondiments(){ return true; } public final void prepareBeverageTemplage(){ //将水煮沸 boilWater(); //炮制饮料 brew(); //倒入杯中 pourInCup(); //调用钩子方法 beforeAddCondiments(); //加入调味料 addCondiments(); } } //也可以使用void方法进行空实现来创建钩子方法. protected void beforeAddCondiments(){ }
    查看全部
  • 步骤二(创建抽象基类的实现类) //具体子类,提供了咖啡制备的具体实现. public class Coffee extends RefreshBeverage{ //实现泡制方法 protected void brew(){ System.out.println("用沸水冲泡咖啡"); } //实现加入调味方法 protected void addCondiments(){ System.out.println("加入糖和咖啡"); } } //具体子类,提供了茶制备的具体实现. public class Coffee extends RefreshBeverage{ //实现泡制方法 protected void brew(){ System.out.println("用80度的热水浸泡茶叶5分钟"); } //实现加入调味方法 protected void addCondiments(){ System.out.println("加入柠檬"); } } 创建测试类: RefreshBeverage b1=new Coffee(); //调用模版方法 b1.prepareBeverageTemplage();
    查看全部
  • 代码部分: 步骤一(创建抽象基类): //抽象基类,为所有子类提供一个算法框架(提神饮料). public abstract class RefreshBeverage{ //制备饮料的模版方法,封装了所有子类共同遵循的算法框架,用final修饰,为了禁止子类重写该方法. public final void prepareBeverageTemplage(){ //将水煮沸 boilWater(); //炮制饮料 brew(); //倒入杯中 pourInCup(); //加入调味料 addCondiments(); } //基本方法,将水煮沸.将水煮沸与将饮料倒入杯中相对于子类是共同的行为,所以声明为私有,由抽象基类实现. private void boilWater(){ System.out.println("将水煮沸"); } private void pourInCup(){ System.out.println("将饮料倒入杯中"); } //brew与addCondiments这两个方法的共同特点在模版方法中并不知道具体的实现是什么.所以定义为抽象方法,让子类去实现该方法. //抽象的基本方法,泡制饮料. protected abstract void brew(); //抽象的基本方法,加入调料. protected abstract void addCondiments(); }
    查看全部
  • 例子举例: 饮料机要生产两种饮料.分别是咖啡和茶. 咖啡制作步骤: 1.把水煮沸 2.用沸水冲泡咖啡 3.把咖啡倒进杯子 4.加糖和牛奶 茶的制作步骤: 1.把水煮沸 2.用沸水浸泡茶叶 3.把茶倒进杯子 4.加柠檬 可以看到把水煮沸和把饮料倒进杯子都是共性问题,另外冲泡、浸泡步骤和加的配料又有区别,但是都是泡饮料与加料步骤. 因此可以为饮料机配置模版. 模版方法步骤: 1.把水煮沸(boilWater) 2.泡饮料(brew) 3.把饮料倒进杯子(pourInCup) 4.加调味料(addCondiments) 由于煮沸水与倒饮料都是共性问题,因此可以直接在基类中实现该方法,泡饮料与加料不是共性问题,因此定义为抽象方法,由子类去进行实现.
    查看全部
  • 模版方法模式的实现要素:准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性,最后将方法汇总构成一个不可改变的模版方法. 使用模版方法模式一般有两种类型的类, 分别是抽象基类与具体子类. 抽象基类中包括: 1.基本方法,即不同子类的共性,可以直接在抽象基类中定义. 2.抽象方法,代表一些只知道具体原则,不知道具体实现细节.需要延迟到子类实现的步骤. 3.可选的构子函数,即在抽象基类中提供任意个默认或空的实现方法,以供给子类决定是否挂钩以及如何挂钩. 4.模版方法,用final关键字修饰. 具体子类中包括: 1.实现基类中的抽象方法. 2.可选的覆盖钩子方法.
    查看全部
  • 模版方法模式: 生活中的模版: 去银行办事,首先是进门取号、填写单据、等待叫号、窗口办理. 这个过程是每个人都一样的.银行为客户定下了这个模版.每个客户到达营业厅都将遵循这个模版来进行业务办理. 银行不知道每个客户要办理什么业务,因此不知道客户填写的具体单据内容,因此银行在这里定了个填写单据步骤,让这个步骤交给具体的客户来实现. 银行为客户定了个模版,而将某些特定步骤留给客户具体实现.这就是模块方法模式. 模版方法模式定义了操作算法框架,框架中定义了算法执行的步骤,但是这个框架当中会将一些步骤延迟到子类中实现.这就使模版方法的子类在不改变一个算法结构的同时,从新定义该算法的特定步骤.
    查看全部
  • 模板缺点,只能单继承
    查看全部

举报

0/150
提交
取消
课程须知
本课程的学习,需要小伙伴们具有面向对象基础知识及 Java 语言基础。如果您是新手,建议先移步 《Java入门第一季》和《Java入门第二季》
老师告诉你能学到什么?
1、什么是模板方法模式 2、模板方法模式如何实现 3、如何在模板方法模式中增加灵活性 4、专门行业是如何使用模板方法模式

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!