一、概述
Proxy属于结构型模式中的一种,为其他对象提供一种代理以控制对这个对象的访问。
二、适用性
1. 远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表。
2. 虚代理(VirtualProxy)根据需要创建开销很大的对象。
3. 保护代理(ProtectionProxy)控制对原始对象的访问。
4. 智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。
三、参与者
1.Proxy:保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。控制对实体的存取,并可能负责创建和删除它。其他功能依赖于代理的类型:
2.RemoteProxy:负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
3.VirtualProxy:可以缓存实体的附加信息,以便延迟对它的访问。
4.ProtectionProxy:检查调用者是否具有实现一个请求所必需的访问权限。
5.Subject:定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
6.RealSubject:定义Proxy所代表的实体。
四、类图
五、代码实现
1. Subject:定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
ObjectP.swift
//
// ObjectP.swift
// 23设计模式
//
// Created by 阳君 on 14/12/2.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// ObjectP定义ObjectImpl和ProxyObject的共用接口,这样就在任何使用ObjectImpl的地方都可以使用ProxyObject
protocol ObjectP {
func action()
}
2. RealSubject:定义Proxy所代表的实体。
ObjectPImpl.swift
//
// ObjectPImpl.swift
// 23设计模式
//
// Created by 阳君 on 14/12/2.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// RealSubject定义Proxy所代表的实体。
class ObjectImpl: ObjectP {
func action() {
print("========");
print("这是被代理的类");
print("========");
}
}
3. Proxy:保存一个引用使得代理可以访问实体。
ProxyObject.swift
//
// ProxyObject.swift
// 23设计模式
//
// Created by 阳君 on 14/12/2.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// ProxyObject保存一个引用使得代理可以访问实体。
class ProxyObject: ObjectP {
/// 被代理类
private let obj:ObjectP
init(obj:ObjectImpl) {
println("这是代理类")
self.obj = obj
}
// MARK: 代理方法实现
func action() {
print("代理开始");
self.obj.action();
print("代理结束");
}
}
六、测试
1. 代码
// 代理模式
let obj = ProxyObject(obj: ObjectImpl())
obj.action()
2. 运行结果
这是代理类
代理开始
========
这是被代理的类
========
代理结束