目录
一、什么是模板模式
在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为模板模式(Template Method)
二、UML图
登场角色:
1、AbstractClass(抽象类)
抽象类角色不仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法。这些抽象方法由子类ConcreteClass角色负责实现。
2、ConcreteClass(具体类)
该角色负责具体实现AbstractClass角色中定义的抽象方法。这里实现的方法将会在AbstractClass角色的模板方法中被调用,由CharDisplay类和StringDisplay类扮演此角色。
三、示例程序
1、Abstract类
package com.as.module.template;
/**
* 字符展示类
* @author Andy
* @date 2021/4/22 20:55
*/
public class CharDisplay extends AbstractDisplay {
private char cn;
public CharDisplay(char cn) {
this.cn = cn;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(cn);
}
@Override
public void close() {
System.out.println(">>");
}
}
2、CharDisplay类
package com.as.module.template;
/**
* 字符展示类
* @author Andy
* @date 2021/4/22 20:55
*/
public class CharDisplay extends AbstractDisplay {
private char cn;
public CharDisplay(char cn) {
this.cn = cn;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(cn);
}
@Override
public void close() {
System.out.println(">>");
}
}
3、StringDisplay类
package com.as.module.template;
/**
* 字符展示类
* @author Andy
* @date 2021/4/22 20:55
*/
public class CharDisplay extends AbstractDisplay {
private char cn;
public CharDisplay(char cn) {
this.cn = cn;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(cn);
}
@Override
public void close() {
System.out.println(">>");
}
}
4、TestTemplate类
package com.as.module.template;
/**
* 模板模式测试类
* @author Andy
* @date 2021/4/22 21:02
*/
public class TestTemplate {
public static void main(String[] args) {
//生成一个持有'H'的CharDisplay类的实例
AbstractDisplay d1 = new CharDisplay('H');
//生成一个持有'Hello,World.'的StringDisplay类的实例
AbstractDisplay d2 = new StringDisplay("Hello,World.");
//生成一个持有'你好,世界'的StringDisplay类的实例
AbstractDisplay d3 = new StringDisplay("你好,世界.");
d1.display();
d2.display();
d3.display();
}
}
运行结果:
四、拓展思路与注意事项
1、可以使逻辑处理通用化
它的优点是由于在父类的模板方法中编写了算法,因此无需在每个子类中再编写算法
2、父类与子类之间的协作
模板模式中,父类与子类是紧密相连,共同工作的。因此,在子类中实现父类中声明的抽象方法时,必须要理解这些抽象方法被调用的时机
3、父类与子类的一致性
在示例程序中,不论是CharDisplay的实例还是StringDisplay的实例,都是先保存在AbstractDisplay类型的变量中,然后再来调用display的方法的。
使用父类类型的变量保存子类实例(如下图)的优点是,即使没有用instanceof等指定子类的种类,程序也能正常工作。