【Template Method模式】

父类定义处理流程的框架,子类实现具体处理。

组成模板的方法被定义在父类中。由于这些方法时抽象方法,所以只查看父类的代码是无法知道这些方法最终会进行何种具体的处理。

实现抽象方法的是子类。在子类中实现了抽象方法决定了具体处理。只要在不同的子类中实现不同的具体处理,当父类的模板方法被调用时程序行为也会不同。但是,不论子类中的具体实现如何,处理的流程都会按照父类所定义的进行。

【子类责任】

父类声明抽象方法期望并要求子类去实现抽象方法,也就说子类具有责任实现在父类中所声明的抽象方法的责任。这种责任被成为“子类责任"。

【抽象类的意义】

由于在抽象方法种并没有编写具体的实现,但是可以通过调用了抽象方法的模板方法去编写处理。虽然处理由子类决定,但是在抽象类阶段确定处理的流程非常重要。

【图解设计模式】模板方法模式_子类

 

模板方法模式中,使用继承改变程序的行为。

策略模式中,使用委托改变程序的行为。策略模式用于替换整个算法。

 【大话设计模式】策略模式_暮色_年华的博客

【图解设计模式】模板方法模式_模板方法模式_02

 

public abstract class AbstractDisplay {//抽象类AbstractDisplay
  public abstract void open();//交给子类去实现的抽象方法(1)open
  public abstract void print();//交给子类去实现的抽象方法(2)print
  public abstract void close();//交给子类去实现的抽象方法(3)close



  public final void display(){
    open();//首先打开...
    for(int i=0;i<5;i++){//循环调用5次print
      print();
    }
    close();//最后关闭
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
public class CharDisplay extends AbstractDisplay{
    private char ch;//需要显示的字符
    public CharDisplay(char ch){//构造函数中接受的字符
        this.ch=ch;
    }
    @Override
    public void open() {
        System.out.print("<<");
    }

    @Override
    public void print() {
        System.out.print(ch);
    }

    @Override
    public void close() {
        System.out.println(">>");
    }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
public class StringDisplay extends AbstractDisplay{
   private String string;
   private int width;
   public StringDisplay(String string){
       this.string=string;
       this.width=string.length();
   }

    @Override
    public void open() {
        printLine();
    }

    @Override
    public void print() {
        System.out.println("|"+string+"|");
    }

    @Override
    public void close() {
         printLine();
    }
    private void printLine(){
        System.out.print("+");
        for(int i=0;i<width;i++){
            System.out.print("-");
        }
        System.out.println("+");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
public class Main {
    public static void main(String[] args) {
    AbstractDisplay d1=new CharDisplay('H');
    AbstractDisplay d2=new StringDisplay("hello");
    d1.display();
    d2.display();

    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.