一、定义
二、使用场景
三、使用方法
四、结构
- 1.模板方法模式包含的角色:抽象父类、具体子类
- 2.抽象父类:负责给出一个算法的轮廓和骨架,由一个模板方法和若干个基本方法构成。
- 3.模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
- 4.基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法分为抽象方法、具体方法、钩子方法
- 5.抽象方法:一个抽象方法由抽象类声明,由具体子类实现
- 6.具体方法:一个具体方法由抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承
- 7.钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。一般钩子方法是用于判断的逻辑方法,这类方法名一般为isXxx,返回值类型为boolean类型
- 8.具体子类:实现抽象类中定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤
五、代码示例
- 1.抽象类
package com.learning.template;
/**
* 抽象类
*/
public abstract class AbstractClass {
//模板方法定义
public final void cookProcess(){
// 倒油
pourOil();
// 热油
heatOil();
// 倒蔬菜
pourVegetable();
// 倒调味品
pourSauce();
// 炒
fry();
}
public void pourOil(){
System.out.println("倒油");
}
public void heatOil(){
System.out.println("热油");
}
public abstract void pourVegetable();
public void pourSauce(){
System.out.println("撒盐");
}
public void fry(){
System.out.println("翻炒");
}
}
- 2.炒包菜
package com.learning.template;
public class Baocai extends AbstractClass{
@Override
public void pourVegetable() {
System.out.println("放入包菜");
}
}
- 3.炒菜心
package com.learning.template;
public class Caixin extends AbstractClass{
@Override
public void pourVegetable() {
System.out.println("放入菜心");
}
}
- 4.测试
package com.learning.template;
public class Client {
public static void main(String[] args) {
Baocai baocai = new Baocai();
baocai.cookProcess();
System.out.println("=======");
Caixin caixin = new Caixin();
caixin.cookProcess();
}
}
六、优点
- 1.提高代码复用性,将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。
- 2.实现了反向控制,通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 ,并符合“开闭原则”。
七、缺点
- 1.对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
- 2.父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度.
八、适用场景
原文地址:https://blog.csdn.net/qq_32088869/article/details/130559127
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_3072.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。