JAVA设计模式-Template

    技术2022-05-20  51

        Template这个模式就是说规定好了做一件事情的框架,但是每一步具体怎么做是空出来的。它在下面三种情况下适用:

     

        1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。这里父类就是一个模板,它规定了哪些方法是可变的,然后子类继承于它,然后填写自己的实现。

        2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了。

     

        3) 控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。

     

        下面看一个例子:

     

        package template; abstract class AbstractDisplay { //由子类实现的抽象方法 public abstract void open(); public abstract void print(); public abstract void close(); //抽象类实现的方法,final可以保证在子类不会被修改 public final void display() { open(); //先open... for(int i=0; i < 5; i++) { //反复输出5次 print(); } close(); //输出完毕,close } } class CharDisplay extends AbstractDisplay { private char ch; //应输出的字符 public CharDisplay(char ch) { //把构造函数传递过来的字符ch,存储在字段内 this.ch = ch; } public void open() { System.out.print("<<"); //输出"<<"作为开始字符串 } public void close() { System.out.println(">>"); //输出 ">>"作为结束字符串 } public void print() { System.out.print(ch); //输出存储在字段的字符 } } class StringDisplay extends AbstractDisplay { private String string; //应输出的字符串 private int width; //以byte为单位所求出的字符串的"长度" public StringDisplay(String string) { this.string =string; width = string.getBytes().length; } public void open() { //打印头装饰字符串 printLine(); } public void print() { //打印内容 System.out.println("|"+string+"|"); } public void close() { //打印尾装饰字符串 printLine(); } public void printLine() { System.out.print("+"); //输出"+"号表示边框位置 for(int i=0; i < width; ++i) { System.out.print("-"); //当作线段 } System.out.println("+"); //输出"+"号表示边框位置 } } public class Test { public static void main(String[] args) { //建立1个有'A'的CharDisplay的对象 AbstractDisplay d1 = new CharDisplay('A'); //建立1个有"Hello world"的StringDisplay的对象 AbstractDisplay d2 = new StringDisplay("Hello World"); //d1,d2都是AbstractDisplay的子类对象,可以调用继承到的display()方法 d1.display(); d2.display(); } }

     

        AbstractDisplay就是一个模板,它定义了执行的过程,即display()方法,但是这个方法里面的open(),print(),close()三个方法是空的,也就是说,父类构建了执行的模板,子类来实现具体的步骤。上述代码的运行结果是:

     

    <<AAAAA>>+-----------+|Hello World||Hello World||Hello World||Hello World||Hello World|+-----------+


    最新回复(0)