设计模式(四)—模板方法模式
最后更新于:2022-04-01 16:26:00
英文名称:Template Method Pattern。
**定义**:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,是的子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
**我的理解**:模板方法模式在编程中常常用到,例如Android开发中创建Activity我们继承Activity,需要重写onCreat()方法和其他固定的方法一样,这就是模板方法模式的应用。他首先要定义一个接口或者类,提供一些方法框架,使用子类去继承这些类,并实现这些方法,是的该方法的具体实现在子类中提供。
**一个例子:**
一个车辆模型定义它的start(),stop(),alarm(),engineBoom(),run()等方法。
不同的车辆都要遵守这个接口,并实现其特有的方法。
定义一个BMWModel类和BenzModel类来实现这个接口,并提供特有的方法。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_57553408beff8.jpg)
~~~
public class TemplateMethodTest {
public static void main(String[] args) {
System.out.println("------奔驰车模板----------");
Model benz = new BenzModel();
benz.run();
System.out.println("------宝马车模板----------");
Model bmw = new BMWModel();
bmw.run();
}
}
abstract class Model{
//车辆启动
protected abstract void start();
//车辆停止
protected abstract void stop();
//车辆鸣笛
protected abstract void alarm();
//车辆发动机轰鸣
protected abstract void engineBoom();
protected void run(){
this.engineBoom();
this.start();
this.alarm();
this.stop();
}
}
class BMWModel extends Model{
@Override
protected void start() {
System.out.println("宝马车启动...");
}
@Override
protected void stop() {
System.out.println("宝马车停止...");
}
@Override
protected void alarm() {
System.out.println("宝马车开始鸣笛...");
}
@Override
protected void engineBoom() {
System.out.println("宝马车发动机轰鸣...");
}
}
class BenzModel extends Model{
@Override
protected void start() {
System.out.println("奔驰启动...");
}
@Override
protected void stop() {
System.out.println("奔驰停止...");
}
@Override
protected void alarm() {
System.out.println("奔驰开始鸣笛...");
}
@Override
protected void engineBoom() {
System.out.println("奔驰发动机轰鸣...");
}
}
~~~
**模板方法模式的应用场景:**
1、多个子类有共有的方法,并且逻辑基本相同
2、重要复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
3、重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为
**模板方法模式的扩展:
1、钩子函数约束子类的行为。
案例扩展:**
老板要求让用户自己设置汽车的鸣笛时间。
那么就需要定义一个isAlarm方法让用户去设置是否鸣笛。从而约束其方法的执行。
~~~
public class TemplateMethodTest {
public static void main(String[] args) {
System.out.println("------奔驰车模板----------");
System.out.println("用户设置车辆是否鸣笛,1表示可以鸣笛,2表示不可以鸣笛.");
BenzModel benz = new BenzModel();
Scanner input = new Scanner(System.in);
String type = input.next();
if(type.equals("1")){
benz.setAlarm(true);
}else if(type.equals("2")){
benz.setAlarm(false);
}else{
System.out.println("无效的输入!");
return;
}
benz.run();
}
}
abstract class Model{
//车辆启动
protected abstract void start();
//车辆停止
protected abstract void stop();
//车辆鸣笛
protected abstract void alarm();
//车辆发动机轰鸣
protected abstract void engineBoom();
protected void run(){
this.engineBoom();
this.start();
//如果isAlarm为true,就执行鸣笛方法。
if(isAlarm())
this.alarm();
this.stop();
}
//用isAlarm设置是否需要鸣笛,默认可以鸣笛。
protected boolean isAlarm(){
return true;
}
}
class BMWModel extends Model{
private boolean flag = true;
public void setAlarm(boolean flag){
this.flag = flag;
}
protected boolean isAlarm() {
return flag;
}
@Override
protected void start() {
System.out.println("宝马车启动...");
}
@Override
protected void stop() {
System.out.println("宝马车停止...");
}
@Override
protected void alarm() {
System.out.println("宝马车开始鸣笛...");
}
@Override
protected void engineBoom() {
System.out.println("宝马车发动机轰鸣...");
}
}
class BenzModel extends Model{
private boolean flag = true;
public void setAlarm(boolean flag){
this.flag = flag;
}
protected boolean isAlarm() {
return flag;
}
@Override
protected void start() {
System.out.println("奔驰启动...");
}
@Override
public void stop() {
System.out.println("奔驰停止...");
}
@Override
public void alarm() {
System.out.println("奔驰开始鸣笛...");
}
@Override
public void engineBoom() {
System.out.println("奔驰发动机轰鸣...");
}
}
~~~