模板方法模式(将具体实现交给子类)
用处
在父类中定义处理流程的框架,在子类中实现具体处理
角色
- AbstractClass:
该角色负责 实现模板方法,以及声明在模板方法中所使用到的抽象方法,这里必须是抽象类,不能为接口,因为需要实现一个模板方法 - ConcreteClass
该角色负责具体实现AbstractClass角色中定义的抽象方法
类图
- 在templateMethod中定义处理流程的框架,并调用method1,method2,method3等抽象方法
- method1,method2,method3等在子类中实现
举例
使用多态,让抽象类AbstractDisplay的模板方法能调用具体实现类ConcreteDisplay1的方法
public class Main {
public static void main(String[] args) {
AbstractDisplay abstractDisplay = new ConcreteDisplay1();
abstractDisplay.display("java");
}
}
//AbstractClass角色
abstract class AbstractDisplay{
abstract void open();
abstract void print(String s);
abstract void close();
void display(String s){
open();
for (int i = 0 ; i < 5 ;i ++){
print(s);
}
close();
}
}
//ConcreteClass角色
class ConcreteDisplay1 extends AbstractDisplay{
@Override
void open() {
System.out.println("11111111111");
}
@Override
void print(String s) {
System.out.println("------"+s+"------");
}
@Override
void close() {
System.out.println("11111111111");
}
}
扩展时,只需要多加一个类
public class Main {
public static void main(String[] args) {
//AbstractDisplay abstractDisplay = new ConcreteDisplay1();
AbstractDisplay abstractDisplay = new ConcreteDisplay2();
abstractDisplay.display("c++");
}
}
//ConcreteClass角色
class ConcreteDisplay2 extends AbstractDisplay{
@Override
void open() {
System.out.println("222222222222");
}
@Override
void print(String s) {
System.out.println("------"+s+"------");
}
@Override
void close() {
System.out.println("222222222222");
}
}
总结
- 模板方法模式符合开闭原则
- 符合里氏替换原则
- 符合单一职责原则