Template Method(模板方法设计模式)

2020-07-08  本文已影响0人  涅槃快乐是金

模板方法设计模式

在模板模式(Template Method)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

介绍

  1. 封装不变部分,扩展可变部分。
  2. 提取公共代码,便于维护。
  3. 行为由父类控制,子类实现。
  1. 有多个子类共有的方法,且逻辑相同。
  2. 重要的、复杂的方法,可以考虑作为模板方法。

AbstractDisplay类:定义打印逻辑

export default abstract class AbstractDisplay {
    public abstract open(): void;
    public abstract print(): void;
    public abstract close(): void;
    public display(): void {
        this.open();
        for (let i = 0; i < 5; i++) {
            this.print();
        }
        this.close();
    }
}

CharDisplay类:打印方式

import AbstractDisplay from "./AbstractDisplay";

export default class CharDisplay extends AbstractDisplay {
    private ch: string;

    constructor(ch: string) {
        super();
        this.ch = ch;
    }
    public open() {
        console.log("《");
    }
    public print() {
        console.log(this.ch);
    }
    public close() {
        console.log("》");
    }
}

StringDisplay类:

import AbstractDisplay from "./AbstractDisplay";

export default class StringDisplay extends AbstractDisplay {
    private str: string;
    constructor(str: string) {
        super();
        this.str = str;
    }
    public open() {
        console.log("+-----+");
    }
    public print() {
        console.log(`|${this.str}|`);
    }
    public close() {
        console.log("+-----+");
    }
}

main函数

import AbstractDisplay from "./AbstractDisplay"
import CharDisplay from "./CharDisplay"
import StringDisplay from "./StringDisplay";

const d1: AbstractDisplay = new CharDisplay("H");
const d2: AbstractDisplay = new StringDisplay("Hello")
d1.display();
d2.display();

输出

《
H
H
H
H
H
》
+-----+
|Hello|
|Hello|
|Hello|
|Hello|
|Hello|
+-----+

结构

AbstractClass(抽象类):AbstractClass不仅负责实现模板方法,还负责声明模板方法中所使用的的抽象方法,这些方法在ConcreteClass去实现
ConcreteClass(具体子类):具体实现AbstractClass类中定义的抽象方法

类图

Template Method类图
上一篇下一篇

猜你喜欢

热点阅读