设计模式-模板方法模式
本文我们简单说下设计模式中的观察者模式。
概述
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
优缺点
优点
- 把通用的不变方法提取到超类,降低子类冗余的代码
- 行为由父类控制,具体实和算法的具体细节现由子类实现
- 遵循开闭原则,可扩展
缺点
- 不同的实现就要新增一个实现类,子类实现会越来越多。
应用场景
- 多个子类有相同的方法,且逻辑实现相同
- 重要的,复杂的方法,可以设计成模板方法。
结构图
模式的结构
模板方法模式的主要角色如下。
代码实现
talk is cheap show me the code。废话少说,直接上代码。
- 模板抽象类
/**
* @author itender
* @date 2022/6/27 16:34
* @desc 工作一天的抽象类
*/
public abstract class WorkerOneDay {
public final void myOneDay() {
// 起床
getUp();
// 吃早饭
eatBreakfast();
// 工作
doWork();
// 下班回家
home();
}
/**
* 起床
*/
public abstract void getUp();
/**
* 吃早饭
*/
public abstract void eatBreakfast();
/**
* 写代码
*/
public abstract void doWork();
/**
* 下班回家
*/
public abstract void home();
}
- 模板子类1
/**
* @author itender
* @date 2022/6/29 18:02
* @desc itender一天的工作
*/
public class ItenderWorkOneDay extends WorkerOneDay {
@Override
public void getUp() {
System.out.println("itender 起床了!");
}
@Override
public void eatBreakfast() {
System.out.println("itender 吃早饭了!");
}
@Override
public void doWork() {
System.out.println("itender 努力工作,加班写代码!");
}
@Override
public void home() {
System.out.println("itender 提交完代码下班回家!");
}
}
- 模板子类2
/**
* @author itender
* @date 2022/6/29 18:06
* @desc 测试工作一天
*/
public class TesterWorkOneDay extends WorkerOneDay {
@Override
public void getUp() {
System.out.println("测试 起床了!");
}
@Override
public void eatBreakfast() {
System.out.println("测试 吃早饭!");
}
@Override
public void doWork() {
System.out.println("测试 开始测试Itender写的代码!");
}
@Override
public void home() {
System.out.println("测试 测试完Itender的代码,提完Bug下班回家!");
}
}
测试代码
/**
* @author itender
* @date 2022/6/29 18:02
* @desc 模板方法模式测试代码
*/
public class TemplateTest {
public static void main(String[] args) {
// 我的一天
WorkerOneDay itenderWorkOneDay = new ItenderWorkOneDay();
itenderWorkOneDay.myOneDay();
// 测试人员的一天
WorkerOneDay testerWorkOneDay = new TesterWorkOneDay();
testerWorkOneDay.myOneDay();
ItenderWorkOneDay itenderWorkOneDay1 = new ItenderWorkOneDay();
itenderWorkOneDay1.myOneDay();
}
}
输出
itender 起床了!
itender 吃早饭了!
itender 努力工作,加班写代码!
itender 提交完代码下班回家!
测试 起床了!
测试 吃早饭!
测试 开始测试Itender写的代码!
测试 测试完Itender的代码,提完Bug下班回家!
itender 起床了!
itender 吃早饭了!
itender 努力工作,加班写代码!
itender 提交完代码下班回家!
Process finished with exit code 0