微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

外观模式-typescript

定义

外观是一种结构型设计模式, 能为复杂系统、 程序库或框架提供一个简单 (但有限) 的接口。

场景

简单来说就是大家基金都玩吧,股票应该也都懂,某一天感觉自己炒股很厉害,就投了一个亿在股票上,但是最后发现亏了好几个亿,你追悔莫及,感觉炒股太难了,需要懂很多东西,是一个很复杂的系统。然后别人告诉你可以玩基金,基金经理会帮你打理你的钱,获得的利润都是你自己的,这就相当于外观模式。基金经理就是所谓的外观,让我们避免与股票的直接接触,从而规避更大的风险。

放到程序开发中,外观类就是给复杂子系统提供一个简单的接口。 与直接调用子系统相比, 外观提供的功能可能比较有限, 但它却包含了客户端真正关心的功能。如果你的程序需要与包含几十种功能的复杂库整合, 但只需使用其中非常少的功能, 那么使用外观模式会非常方便。

图示:

没有外观模式时:

在这里插入图片描述

有了外观模式后:

在这里插入图片描述

Typescript外观模式

使用示例: 使用 TypeScript 开发的程序中会经常使用外观模式。 它在与复杂程序库和 API 协作时特别有用。

class Facade {
    protected subsystem1: Subsystem1;

    protected subsystem2: Subsystem2;

    constructor(subsystem1: Subsystem1 = null, subsystem2: Subsystem2 = null) {
        this.subsystem1 = subsystem1 || new Subsystem1();
        this.subsystem2 = subsystem2 || new Subsystem2();
    }

    public operation(): string {
        let result = 'Facade initializes subsystems:\n';
        result += this.subsystem1.operation1();
        result += this.subsystem2.operation1();
        result += 'Facade orders subsystems to perform the action:\n';
        result += this.subsystem1.operationN();
        result += this.subsystem2.operationZ();

        return result;
    }
}

class Subsystem1 {
    public operation1(): string {
        return 'Subsystem1: Ready!\n';
    }

    // ...

    public operationN(): string {
        return 'Subsystem1: Go!\n';
    }
}

class Subsystem2 {
    public operation1(): string {
        return 'Subsystem2: Get ready!\n';
    }

    // ...

    public operationZ(): string {
        return 'Subsystem2: Fire!';
    }
}

function clientCode(facade: Facade) {
    // ...

    console.log(facade.operation());

    // ...
}

const subsystem1 = new Subsystem1();
const subsystem2 = new Subsystem2();
const facade = new Facade(subsystem1, subsystem2);
clientCode(facade);

执行结果:

Facade initializes subsystems:

Subsystem1: Ready!

Subsystem2: Get ready!

Facade orders subsystems to perform the action:

Subsystem1: Go!

Subsystem2: Fire!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐