设计模式学习笔记——模板(Template)模式
@(设计模式)[设计模式, 模板模式, template, 模板方法]
基本介绍
模板模式可以很简单的理解为,通过同一个模具倒出来的模型。形状上是一样的,但是其上的花纹,纹理等却可能完全不一样。
这里的模板模式,特指Template Method
模板方法模式。其原理为父类制定好规范——待实现的方法和模板方法。子类实现待实现的方法。调用者调用模板方法。
模板案例
类图
实现代码
AbstractDisplay抽象类
package com.pc.template.example;
/**
* 抽象显示类
* Created by Switch on 2017-02-03.
*/
public abstract class AbstractDisplay {
/**
* 打开
*/
public abstract void open();
/**
* 打印
*/
public abstract void print();
/**
* 关闭
*/
public abstract void close();
/**
* 显示
*/
public final void display() {
// 打开
open();
// 打印5次
for (int i = 0; i < 5; i++) {
print();
}
// 关闭
close();
}
}
CharDisplay类
package com.pc.template.example;
/**
* 字符显示类
* Created by Switch on 2017-02-03.
*/
public class CharDisplay extends AbstractDisplay {
// 字符
private char ch;
/**
* 构造方法接收字符
*
* @param ch 字符
*/
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(this.ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
StringDisplay类
package com.pc.template.example;
/**
* 字符串显示类
* Created by Switch on 2017-02-03.
*/
public class StringDisplay extends AbstractDisplay {
// 字符串
private String string;
// 字符串字节长度
private int width;
/**
* 构造方法接收字符串
*
* @param string 字符串
*/
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + this.string + "|");
}
@Override
public void close() {
printLine();
}
/**
* 打印一行,如下
* +------------+
*/
private void printLine() {
System.out.print("+");
for (int i = 0; i < this.width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
测试类
package com.pc.template.example.test;
import com.pc.template.example.AbstractDisplay;
import com.pc.template.example.CharDisplay;
import com.pc.template.example.StringDisplay;
import org.junit.Test;
/**
* 显示测试类
* Created by Switch on 2017-02-04.
*/
public class DisplayTest {
@Test
public void testDisplay() {
AbstractDisplay display1 = new CharDisplay('s');
AbstractDisplay display2 = new StringDisplay("Switch");
AbstractDisplay display3 = new StringDisplay("交换机");
display1.display();
display2.display();
display3.display();
}
}
运行结果
<<sssss>>
+------+
|Switch|
|Switch|
|Switch|
|Switch|
|Switch|
+------+
+---------+
|交换机|
|交换机|
|交换机|
|交换机|
|交换机|
+---------+
模板模式中的角色
AbstractClass(抽象类)
AbstractClass
角色不仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法。这些抽象方法由子类ConcreteClass
角色负责实现。在案例中,由AbstractDisplay
类扮演此角色。
ConcreteClass(具体类)
该角色负责具体实现AbstractClass
角色中定义的抽象方法。这里实现的方法将会在AbstractClass
角色的模板方法中被调用。在案例中,由CharDisplay
类和StringDisplay
类扮演此角色。
类图
GitHub:DesignPatternStudy
——————参考《图解设计模式》