代理模式定义:
代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。
代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景。比如,明星都有经纪人作为代理。 到法院打官司,大部分情况都有律师。
UML 类图示例:
实现方式
在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 的实例,为大家讲解了,代理模式的具体实现。 接下来我们来看一些代理模式的变种。