Template Method模式

Template Method模式

    • Template Method模式
    • 示例程序
    • 使逻辑处理通用化

Template Method模式

在父类中定义处理流程的框架,在子类中实现具体处理。也就是父类中包含许多抽象方法和处理流程,这些抽象方法需要子类去实现,只要子类实现不同的处理,父类被调用的程序行为也会不同,但是处理流程都会按照父类所定义的那样执行。

示例程序

1、AbstractDisplay类
这里定义了三个抽象方法和一个模板方法display,抽象类的具体实现交个子类,模板方法就是调用抽象方法,并且固定了执行流程。并且,display模板方法使用了final修饰符,为了不让子类重写该方法。

package com.design.pattern3;

public abstract class AbstractDisplay {
    //抽象类
    public abstract void open();
    public abstract void print();
    public abstract void close();
    
    //模板方法,固定了抽象方法的调用流程
    public final void display(){
        open();
        for (int i = 0;i < 5 ;i++){
            print();
        }
        close();
    }
}

2、CharDisplay类(子类)

package com.design.pattern3;

public class CharDisplay extends AbstractDisplay{
    private char ch;

    public CharDisplay(char ch) {
        this.ch = ch;
    }

    @Override
    public void open() {
        System.out.println("打开");
    }

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

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

3、StringDisplay类(子类)

package com.design.pattern3;

public class StringDisplay extends AbstractDisplay {
    private String string;

    public StringDisplay(String string) {
        this.string = string;
    }

    @Override
    public void open() {
        System.out.println("打开");
    }

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

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

4、 Main类

package com.design.pattern3;

public class Main {
    public static void main(String[] args) {
        AbstractDisplay d1 = new CharDisplay('H');
        AbstractDisplay d2 = new StringDisplay("hello world");
        d1.display();
        d2.display();
    }
}

Templete Method模式需要两个元素:
1、AbstractClass(抽象类)
主要负责声明抽象方法,以及定义和实现模板方法。
2、ConcreteClass(具体类)
负责实现AbstractClass类中的抽象方法。

在AbstractClass类中,display方法使用了final修饰符,作用是为了不让子类重写该方法。还有一个问题,抽象类和接口很相似,接口同样可以定义抽象方法,为什么这里不用接口?答案是Templete Method模式中,抽象类(父类)必须定义和实现模板方法,也就是必须实现处理流程的框架,接口中无法实现。

使逻辑处理通用化

  使用模板方法可以使逻辑处理通用化,就是在父类中编写算法,不需要在每个子类中再编写算法。
  例如:如果没有使用模板方法,使用复制粘贴功能编写了多个ConcreteClass类,有ConcreteClass1、ConcreteClass2、ConcreteClass3等很多相似的类,在后期如果发现ConcreteClass1中有bug,那么就必须把所有ConcreteClass1相似的类都检查和修改一遍才行。如果使用Templete Method模式进行编程,当在模板方法中发现bug时,只需要修改模板方法即可。

你可能感兴趣的:(设计模式)