设计模式学习笔记——模板(Template)模式

来源:互联网 发布:单倍型分析软件 编辑:程序博客网 时间:2024/05/17 01:17

设计模式学习笔记——模板(Template)模式

@(设计模式)[设计模式, 模板模式, template, 模板方法]

  • 设计模式学习笔记模板Template模式
    • 基本介绍
    • 模板案例
      • 类图
      • 实现代码
        • AbstractDisplay抽象类
        • CharDisplay类
        • StringDisplay类
        • 测试类
        • 运行结果
    • 模板模式中的角色
      • AbstractClass抽象类
      • ConcreteClass具体类
      • 类图

基本介绍

模板模式可以很简单的理解为,通过同一个模具倒出来的模型。形状上是一样的,但是其上的花纹,纹理等却可能完全不一样。

这里的模板模式,特指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

——————参考《图解设计模式》

0 0