模版方法模式
在模板方法模式(Template Method)中,定义一个操作中的算法框架,将内容交给子类处理。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定逻辑。
例子
人拥有的时间是一样的,但是怎么安排是不一样的。
使用场景
1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法。
优点
- 把不可改变的封装起来,把能够改变的扩展开来
- 他把很多类的共同操作给封装了起来,利于维护
缺点
- 每一个不同的实现都要交给不同的子类,导致个数增加,比较重量级。
代码
1、抽象类(AbstractClass):实现了模板方法,定义了算法的骨架
package com.mode.templatemethod;
/**
* 日程
*/
public abstract class Schedule {
/**
* 早上
*/
abstract void morning();
/**
* 中午
*/
abstract void noon();
/**
* 下午
*/
abstract void afternoon();
/**
* 晚上
*/
abstract void evening();
/**
* 计划
*/
void arrange(){
morning();
noon();
noonbreak();
afternoon();
evening();
}
/**
* 安排午休
*/
void noonbreak(){
System.out.println("中午睡个午觉");
}
}
2、具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
package com.mode.templatemethod;
public class XiaoMing extends Schedule{
@Override
void morning() {
System.out.println("小明早上晨跑");
}
@Override
void noon() {
System.out.println("小明中午打麻将");
}
@Override
void afternoon() {
System.out.println("小明下午打游戏");
}
@Override
void evening() {
System.out.println("小明晚上吃烧烤");
}
}
3、测试类
package com.mode.templatemethod;
public class TestTemplate {
public static void main(String[] args) {
Schedule schedule = new XiaoMing();
schedule.arrange();
}
}
4、结果
小明早上晨跑
小明中午打麻将
中午睡个午觉
小明下午打游戏
小明晚上吃烧烤