}
takeOrders("三国演义");
takeOrders("水浒传");
takeOrders("封神榜");
takeOrders("三体");
takeOrders("红楼梦");
takeOrders("三国演义");
takeOrders("封神榜");
takeOrders("水浒传");
for (let i in orders) {
orders[i].cell();
}
console.log("\n客户一共买了 " + orders.length + " 本书! "); // 客户一共买了 8 本书!
console.log("共生成了 " + factory.getTotalObjs() + " 个 Book 对象! "); // 共生成了 5 个 Book 对象!
代理模式:
1、定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用
2、模型结构:
(1)抽象主题角色(Subject):通过接口或抽象类声明真实主题和代理对象实现的业务方法
(2)代理主题角色(Proxy):提供了与真实主题相同的接口,其内部含有对真实主题的引用,
它可以访问、控制或扩展真实主题的功能
(3)真实主题角色(RealSubject):实现抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象
3、优点:
(1)代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
(2)代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
(3)代理对象可以扩展目标对象的功能
4、缺点:
(1)在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
(2)实现代理模式需要额外的工作,有些代理模式的实现非常复杂,增加系统复杂度
5、适用环境:
(1)远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,
这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
(2)虚拟(Virtual)代理:如果需要创建一个资源消耗较大的对象,
先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建
(3)保护(Protect or Access)代理:控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限
(4)智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外操作,如记录该对象被调用的次数等
(5)缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
(6)防火墙(Firewall)代理:保护目标不让恶意用户接近
(7)同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突
(8)Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行
// 保护代理
// 抽象主题角色 Subject
interface Doc {
read(): string;
}
// 真实主题角色 RealSubject
class SecretDoc implements Doc {
private secret: string = "Secret doc!!!";
private password: string = "123";
read(): string {
return this.secret;
}
getPsw(): string {
return this.password;
}
}
// 代理主题角色 Proxy
class ProtectionSecretDocProxy implements Doc{
private doc: SecretDoc;
private inputPsw: string;
constructor(password: string) {
this.inputPsw = password;
this.doc = new SecretDoc();
}
// 判断密码是否正确
checkPassword(): boolean {
return this.doc.getPsw() === this.inputPsw;
}
read(): string {
if (this.checkPassword()) {
return this.doc.read();
}
return "Password is wrong!";
}
}
let userProxy1: ProtectionSecretDocProxy = new ProtectionSecretDocProxy("123");
console.log("User1 get: " + userProxy1.read()); // User1 get: Secret doc!!!
let userProxy2: ProtectionSecretDocProxy = new ProtectionSecretDocProxy("234");
console.log("User2 get: " + userProxy2.read()); // User2 get: Password is wrong!
|