前言
代理模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
代理模式
应用场景:用作业务的中间层来处理,会提供功能相关的全新接口,这些功能接口是基于原始的功能进行再次处理得来的。比如拦截器、过滤器、缓存等等。对数据源的读写操作都会先通过中间这一层,中间这一层就是代理,所以一般可以在代理这里设置关卡,比如监控、统计、鉴权、限流、日志、缓存等等。
理解:类、对象的结构和使用解耦,代理模式可以通过继承的方式也可以通过静态借用的方式,也可以使用动态借用的方式。代理是中间层,任何操作都要经过这个中间层,有了这个中间层就可以有很多的操作。中间层一般都会对外屏蔽目标,目标对外是不可见的。
namespace struct_mode_02 {
interface SignAContract {
signAContract (): void
}
//#region
// 产品类
class SuperStar implements SignAContract {
signAContract(): void {
console.log('—————— 签约 ——————')
}
}
// 代理类:继承
class StarAgent extends SuperStar {
signAContract () {
console.log('—————— 经纪人准备合同 ——————')
super.signAContract()
console.log('—————— 签约完毕 ——————')
}
}
// 代理类:借用
class StarAgent2 implements SignAContract {
superStar: SignAContract = new SuperStar()
signAContract(): void {
console.log('—————— 经纪人准备合同 2——————')
this.superStar.signAContract()
console.log('—————— 签约完毕 2——————')
}
}
// 代理类:动态代理
class StarAgent3 implements SignAContract {
superStar?: SignAContract
signAContract(): void {
if (!this.superStar) {
console.log('当前经济人未签约任何明星。')
return
}
console.log('—————— 经纪人准备合同 3——————')
this.superStar.signAContract()
console.log('—————— 签约完毕 3——————')
}
setStar (star: SignAContract): SignAContract {
this.superStar = star
return this
}
}
// 使用 1:继承
new StarAgent().signAContract()
// 使用2:代理借用
new StarAgent2().signAContract()
// 使用3:动态代理
new StarAgent3().setStar(new SuperStar()).signAContract()
}