设计模式3--Template Method

1.什么是Template Method模式

Template Method模式是带有模板功能的模式,组成模板的方法被定义在父类中。由于这些方法是抽象方法,所以只能查看父类的代码是无法知道这些方法最终会进行何种具体处理的,唯一能知道的就是父类如何调用这些方法。

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

像这样在父类中规定处理流程的框架,在子类实现具体处理的模式就称为Template Method模式

2.示例程序

类的一览表

名字说明
AbstractDisplay只实现了display方法的抽象方法
CharDisplay实现了open,print,close方法的类
stringDisplay实现了open,print,close方法的类
Main测试程序行为的类

示例程序的类图

 AbstractDisplay类

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();
    }
}

CharDisplay类

 public class CharDisplay extends AbstractDisplay{
        private char ch;
        public CharDisplay(char ch){
            this.ch = ch;
        }
        public void open(){
            System.out.println("<<");
        }
        public void print(){
            System.out.println(ch);
        }
        public void close(){
            System.out.println(">>");
        }
    }

StringDisplay类

    public class StringDisplay extends AbstractDisplay{
        private String string;
        private int width;
        public StringDisplay(String string){
            this.string = string;
            this.width = string.getBytes().length;
        }
        public void open(){
            printLine();
        }public void print(){
            System.out.println("|" + string + "|");
        }
        public void close(){
            printLine();
        }
        private void printLine(){
            System.out.println("+");
            for (int i = 0;i < width;i++){
                System.out.println("-");
            }
            System.out.println("+");
        }
    }

Main类

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

3.Temolate Method模式中的登场角色

AbstractClass(抽象类)

该角色不不仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法。这些抽象方法由子类ConcreteClass角色负责实现。在示例程序中,由AbstractDisplay方法实现

ConcreteClass(具体类)

该角色负责实现AbstractClass角色中定义的抽象方法。这里实现的方法将会在AbstractClass角色的模板方法中被调用。在示例程序中,由CharDisplay类和StringDisplay类扮演

4.拓展思路的要点

可以使逻辑处理通用化

使用Template Method模式进行变成,当我们在模板方法中发现BUG时,只需要修改模板方法的代码

父类与子类之间的协作

在Template Method模式中,父类和子类是紧密联系,共同工作的。因此,在子类中实现父类中声明的抽象方式时,必须要理解这些抽象方法被调用的实际。在看不到父类的源代码的情况下,想要编写子类是非常困难的

父类与子类的一致性

使用父类类型的变量保存子类实例的优点是,及时没有用instanceof等指定子类的种类,程序也能正常工作

5.类的层次与抽象类

我们在理解类的层次是,通常是站在子类的角度进行思考的。也就是说,很容易着眼于以下几点

(1)在子类中可以使用父类中定义的方法

(2)可以通过在子类中增加方法以实现新的功能

(3)在子类中重写父类的方法可以改变程序的行为

现在,让我们稍微改变一下立场,站在父类的角度进行思考。在父类中,我们声明了抽象方法,而将该方法的实现交给了子类。换而言之,就程序而言,声明抽象方法就是希望达到以下几点:

(1)期待子类去实现抽象方法

(2)要求子类实现抽象方法

也就是说,子类具有实现在父类中所声明的抽象方法的责任。因此,这种责任被成为“子类责任”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值