模板方法模式
概念
模板方法模式确实非常简单,仅仅使用了Java的继承机制
模板方法一般都会加上final关键字, 不允许覆写
功能固定, 但是有一些需要定制; 功能固定就是抽象, 需要定制就是子类实现
基本实现
首先, 需要定义一个模板抽象类, 里面包含有基本方法和模板方法
模板方法设计模式中, 包含有基本方法、模板方法;
基本方法:
可以是在抽象类里面就实现的方法, 也可以是一个抽象的方法, 由子类实现;
模板方法:
决定基本方法的执行顺序, 最后的最后, 模板方法是由子类的对象来调用; 因为模板类是一个抽象的类, 无法实例化
应用场景
模板类
public abstract class MsgTemplate {
/**
* 下面这三个都是模板设计模式里面的基本方法
* 在抽象类里面可以有实现, 同时也可以由子类实现, 但是最后调用的时候还是
* 子类的对象调用
*/
//由子类实现的方法
protected abstract void start();
//春节短信模板
public void chunJie() {
System.out.println("春节到,给您拜年了:一拜全家好!二拜困难少!三拜烦恼消!四拜不变老!" +
"五拜幸福绕!六拜忧愁抛!七拜收入高!八拜平安罩!九拜乐逍遥!");
}
//国庆节短信模板
public void guoQing() {
System.out.println("平淡的辞藻,堆砌祝福的美好;不需多思考,真心的问候送到。" +
"国庆佳节,愿快乐为你笑弯腰,钞票直向你奔跑,幸福不离分分秒,吃好玩好休息好!");
}
/**
* MsgTemplate 中定义的模板方法, 后续的方法直接调用这个方法
* 最后还是子类的对象调用这个模板方法
* @param holiday
*/
public void sendMSg(Holiday holiday){
switch (holiday){
case GUO_QING:
start();
guoQing();
break;
case NEW_YEAR:
start();
chunJie();
break;
}
}
}
在定义Holiday的时候使用到了Enum
public enum Holiday {
//国庆,劳动,春节;
GUO_QING, LAO_DONG, NEW_YEAR;
}
场景类
public class Client {
public static void main(String[] args) {
/**
* 需求:实现一个万能节日短信模板系统
* 该短信模板具备发短信的功能,提供发短信的方法,该方法可以根据传入的实参不同,发送不同节日短信
* 该短信模板可以让不同的子类实现,比如给领导发短信的类、给朋友发短信的类、给女友发短信的类
*/
//new出一个子类对象
Msg msg = new Msg();
//使用子类对象调用模板方法
msg.sendMSg(Holiday.GUO_QING);
}
}
小结:
模板方法只使用了抽象类, 可以看做是把很多个基本方法集合在一起放在一个模板方法里面; 基本方法里面可以有子类的个性实现, 但是定义还是在抽象类里面;
最后的最后还是用子类的对象来调用模板方法, 因为子类有个性的实现, 其他类里面没有;