代理模式
在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
代理模式需要的三个必不可少的对象
被代理的对象
;做代理的对象
;使用代理对象的对象
。
简单的理解这三个对象,以买车
为例:
被代理的对象
可以理解成汽车厂家,厂家只负责生产车子,所以此时就需要 4s店
来提供销售和服务,此时 4s店
就是 做代理的对象
,作为消费者的个人,买车以及售后肯定是去找 4s店
,那对于整个流程来说,个人就是 使用代理对象的对象
。
代码实现
class Store extends Factory {
constructor() {
super();
}
sall(): string {
this.total--;
return "领克03"
}
afterSale(): void {
console.log("售后服务!");
}
}
class Custoemr {
shop(car: string): void {
console.log(`买了一辆${car}`);
}
}
// 实例化出一个做代理的对象
const lingke = new Store();
// 实例化一个 使用代理对象的对象
const zs = new Custoemr();
zs.shop(lingke.sall());
正向代理
和反向代理
代理模式再细分,可以分为正向代理
和反向代理
。
1. 正向代理:
从客户端
出发,到目标服务器
,由于种种原因,这条链路没办法走通,所以客户端
找了一个代理服务器
,这样客户端
可以通过代理服务器
访问目标服务器
;工作机制就是代理服务器
转发请求到目标服务器
,然后目标服务器
将结果返回给代理服务器
,代理服务器
再将结果返回给客户端
。
生活中的例子可以参考 vpn
。
特点:
- 从
客户端
出发,客户端
明确的知道代理服务器
和目标服务器
的存在; 目标服务器
不知道真实客户端
是谁,只会将代理服务器
当作客户端
。
2. 反向代理
反向代理是基于服务端的,有时候,为了解决访问量过大,或者对某些请求进行过滤等需求,我们不会直接对外暴露真实的服务器,而是将推出一个代理服务器,通过代理服务器,在进行一系列的校验,或者做分流等操作后,再将请求转发到真实服务器,整个过程中,客户端并不知道真实的服务器是什么。
比较典型的例子就是 nginx
.
特点:
- 反向代理是基于服务端的,不对外暴露真实的服务器;
- 客户端不知道真实的服务器是什么,更不知道服务器进行了什么操作。