typescript 设计模式 - 代理模式(二)

261 阅读1分钟

代理模式定义:

代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。

代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景。比如,明星都有经纪人作为代理。 到法院打官司,大部分情况都有律师。

UML 类图示例:

image.png

实现方式

在Typescript中,要实现代理模式,相对比较简单我们只需要让,ProxyClass 和 DanmakuClass implates 同一个接口即可。

我们以视频网站常见的弹幕功能为例,做一个具体实现。

假设,弹幕功能默认关闭,我们在不触发,发送弹幕和弹幕开关2个功能之前,是不需要创建DanmakuClass的。这样能减少一些开销。

只有在,调用发送弹幕或者弹幕开关时,我们通过代理类,去判断 实例对象是否存在进而进行实例化来减小首次初始化时候的开销。




interface Danmaku {
    sendDanmaku(content): void;
    openDanmaku(): void;
    closeDanmaku(): void;
}



class DanmakuClass implements Danmaku {

    constructor() {
        console.log('this is a DanmakuClass');
    }

    sendDanmaku(content) {
        console.log('这是真正发出弹幕了!')
    }

    openDanmaku() {
        console.log('开启弹幕')
    }

    closeDanmaku() {
        console.log('关闭弹幕')
    }
}

class ProxyDanmaku implements Danmaku {

    private _danmaku: DanmakuClass;
    constructor() {
    }

    sendDanmaku(content) {
        if(!this._danmaku) this._danmaku = new DanmakuClass()
        this._danmaku.sendDanmaku(content);
    }

    openDanmaku() {
        if(!this._danmaku) this._danmaku = new DanmakuClass()
        this._danmaku.openDanmaku();
    }

    closeDanmaku() {
        if(!this._danmaku) this._danmaku = new DanmakuClass()
        this._danmaku.closeDanmaku();

    }
}
// 使用示例:

const danmaku = new ProxyDanmaku(); //此时并未实现真正的功能实例。

// 发送弹幕。 

danmaku.sendDanmaku('hello world!'); // 实例化真实类

好了,如上代码我们就通过typescript 的实例,为大家讲解了,代理模式的具体实现。 接下来我们来看一些代理模式的变种。