模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类,模板方法使得子类可以不改变一个算法即可定义算法的某些特定步骤
算法的基本组当成:
顶层抽象模板类
内部实现一个模板方法,定义了算法的骨架,加上若干个特性步骤
具体模板类
继承抽象模板类,实现具体的特性步骤。
栗子:以开车为例子,一个人会接触到很多不同的车,火车,汽车,自行车,尽管是不同类型的车,在我们驾驶的时候,某些地方是共性的,比如我们都需要以某种方式上车并启动,我们都需要某种方式驾驶,我们都需要某种方式去停止行驶,而这些方式,都需要根据不同的类型的车来进行相应的实现。可以说,有一个驾驶的抽象类,里面定义了开始,行驶,停止的算法骨架,加上一个开车的模板方法,当有不同的车的时候,我们根据不同的车实现具体的算法骨架。
顶层抽象模板类
package template;
/**
* Created by canon on 2018/11/27.
*/
public abstract class Drive {
public abstract void start();
public abstract void run();
public abstract void stop();
public void dirve(){
start();
run();
stop();
};
}
具体模板类
package template;
/**
* Created by canon on 2018/11/27.
*/
public class Bike extends Drive {
@Override
public void start() {
System.out.println("直接上车。扶好车把手");
}
@Override
public void run() {
System.out.println("发动双脚,开始人力旅行");
}
@Override
public void stop() {
System.out.println("两只手捏刹车,小轮子停止,直接下车");
}
}
package template;
/**
* Created by canon on 2018/11/27.
*/
public class Car extends Drive{
@Override
public void start() {
System.out.println("打开车门,进去。启动发动机。xx离合,xx油门,开始走起");
}
@Override
public void run() {
System.out.println("扶好方向盘,踩油门,拉拉手刹,帅");
}
@Override
public void stop() {
System.out.println("松油门,踩刹车,拉起手刹,over");
}
}
客户端
package controller;
import template.Bike;
import template.Car;
/**
* Created by canon on 2018/11/27.
*/
public class TemplateDesignPattern {
public static void main(String[] args) {
System.out.println("-----------------------------------------------");
Bike bike = new Bike();
bike.dirve();
System.out.println("-----------------------------------------------");
Car car = new Car();
car.dirve();
System.out.println("-----------------------------------------------");
}
}
输出
-----------------------------------------------
直接上车。扶好车把手
发动双脚,开始人力旅行
两只手捏刹车,小轮子停止,直接下车
-----------------------------------------------
打开车门,进去。启动发动机。xx离合,xx油门,开始走起
扶好方向盘,踩油门,拉拉手刹,帅
松油门,踩刹车,拉起手刹,over
-----------------------------------------------
Process finished with exit code 0
模板方法的优点 通过把不同行为搬到超类,去除子类的重复的行为,实现了很好的代码复用,
缺点 :引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
网友评论