代理模式(34)
一、代理模式概述
代理模式(Delegate Pattern)是一种行为设计模式,它允许对象将某些操作委托给其他对象处理。在Swift中,代理模式通常通过协议(Protocol)来实现,使得对象间的通信更加松散耦合。代理模式的核心思想是定义一个协议,声明一组方法,然后由其他对象(代理)实现这些方法,从而完成特定的任务。
1.1 代理模式的基本概念
代理模式涉及三个主要角色:
代理模式的优点包括:
- 降低对象间的耦合度,提高代码的可维护性和可扩展性。
- 实现代码的职责分离,使每个对象专注于自己的核心功能。
- 提供了一种灵活的方式来扩展对象的功能,无需修改原有的代码。
1.2 代理模式在Swift中的应用场景
在Swift开发中,代理模式广泛应用于以下场景:
二、代理模式的源码实现
2.1 协议定义
在Swift中,代理协议通常定义为一个协议,其中包含一组方法声明。这些方法可以是必需的(默认)或可选的(使用@objc optional标记)。
以下是一个简单的代理协议定义:
// 定义一个代理协议 protocol DataDownloaderDelegate: AnyObject { // 下载成功时调用的方法 func downloader(_ downloader: DataDownloader, didFinishWithData data: Data) // 下载失败时调用的方法 func downloader(_ downloader: DataDownloader, didFailWithError error: Error) }在这个例子中,DataDownloaderDelegate协议定义了两个方法,分别用于处理下载成功和失败的情况。
2.2 委托者实现
委托者是拥有代理对象引用的类,它在适当的时候调用代理方法。
以下是一个简单的委托者实现:
// 数据下载器类,作为委托者 class DataDownloader { // 弱引用代理对象,避免循环引用 weak var delegate: DataDownloaderDelegate? // 下载URL的方法 func downloadData(from url: URL) { // 创建URL会话数据任务 let task = URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in // 检查是否有错误 if let error = error { // 调用代理的下载失败方法 self?.delegate?.downloader(self!, didFailWithError: error) return } // 检查是否有数据 guard let data = data else { let error = NSError(domain: "DataDownloader", code: 0, userInfo: [NSLocalizedDescriptionKey: "No data received"]) // 调用代理的下载失败方法 self?.delegate?.downloader(self!, didFailWithError: error) return } // 调用代理的下载成功方法 self?.delegate?.downloader(self!, didFinishWithData: data) } // 启动任务 task.resume() } }在这个例子中,DataDownloader类负责从URL下载数据,并在下载完成或失败时调用代理的相应方法。
2.3 代理实现
代理是实现委托者定义的协议方法的类。
以下是一个简单的代理实现:
// 实现代理协议的类 class DataManager: DataDownloaderDelegate { // 下载器实例 let downloader = DataDownloader() init() { // 设置自己为下载器的代理 downloader.delegate = self } // 实现下载成功的方法 func downloader(_ downloader: DataDownloader, didFinishWithData data: Data) { // 处理下载成功的数据 print("Data downloaded successfully: \(data.count) bytes") // 可以在这里进行数据解析等操作 } // 实现下载失败的方法 func downloader(_ downloader: DataDownloader, didFailWithError error: Error) { // 处理下载失败的情况 print("Data download failed: \(error.localizedDescription)") } // 开始下载的方法 func startDownloadingData(from url: URL) { downloader.downloadData(from: url) } }在这个例子中,DataManager类实现了DataDownloaderDelegate协议,并处理下载成功和失败的情况。
2.4 弱引用的使用
在代理模式中,为了避免循环引用,通常使用弱引用(weak)来引用代理对象。
// 弱引用代理对象,避免循环引用 weak var delegate: DataDownloaderDelegate?如果不使用弱引用,委托者和代理之间可能会形成强引用循环,导致内存泄漏。
三、代理模式的高级特性
3.1 可选方法
在Swift中,可以使用@objc optional标记来定义可选的代理方法。这样,代理对象可以选择性地实现这些方法。
// 定义一个包含可选方法的代理协议 @objc protocol DataDownloaderDelegate: AnyObject { // 必需实现的方法 func downloader(_ downloader: DataDownloader, didFinishWithData data: Data) // 可选实现的方法 @objc optional func downloader(_ downloader: DataDownloader, didUpdateProgress progress: Double) }在使用可选方法时,需要注意在调用前检查方法是否被实现:
// 检查可选方法是否被实现 self?.delegate?.downloader?(self!, didUpdateProgress: progress)3.2 泛型代理
可以使用泛型来创建更灵活的代理协议,使其能够处理不同类型的数据。
// 泛型代理协议 protocol GenericDelegate: AnyObject { associatedtype T func didReceive(data: T) } // 使用泛型代理的类 class GenericDataManager<T> { weak var delegate: GenericDelegate<T>? func processData(_ data: T) { // 处理数据 delegate?.didReceive(data: data) } }3.3 多代理支持
一个委托者可以支持多个代理,通过数组存储多个代理对象。
// 支持多个代理的委托者 class MultiDelegateManager { // 使用数组存储多个代理 private var delegates: [DataDownloaderDelegate] = [] // 添加代理的方法 func addDelegate(_ delegate: DataDownloaderDelegate) { delegates.append(delegate) } // 移除代理的方法 func removeDelegate(_ delegate: DataDownloaderDelegate) { if let index = delegates.firstIndex(where: { $0 === delegate }) { delegates.remove(at: index) } } // 通知所有代理下载成功 func notifyDelegatesOfSuccess(data: Data) { for delegate in delegates { delegate.downloader(self, didFinishWithData: data) } } // 通知所有代理下载失败 func notifyDelegatesOfFailure(error: Error) { for delegate in delegates { delegate.downloader(self, didFailWithError: error) } } }四、代理模式的优缺点
4.1 优点
4.2 缺点
五、通知机制概述
通知机制(Notification Mechanism)是一种对象间通信的模式,它允许一个对象(发布者)向多个对象(观察者)发送消息。在Swift中,通知机制通常通过NotificationCenter类来实现,它是一个基于观察者模式的全局事件总线。
5.1 通知机制的基本概念
通知机制涉及三个主要角色:
通知机制的优点包括:
- 松耦合:发布者和观察者之间不需要直接引用,降低了对象间的耦合度。
- 一对多通信:一个通知可以被多个观察者接收,实现了一对多的通信。
- 全局通信:通知可以在应用的任何地方发布和接收,方便实现跨模块的通信。
5.2 通知机制在Swift中的应用场景
在Swift开发中,通知机制广泛应用于以下场景:
六、通知机制的源码实现
6.1 NotificationCenter类
在Swift中,通知机制的核心是NotificationCenter类。它是一个单例类,提供了注册观察者、发布通知和移除观察者的方法。
以下是NotificationCenter类的简化实现:
// 通知中心类(单例) class NotificationCenter { // 单例实例 static let defaultCenter = NotificationCenter() // 私有初始化方法,确保单例 private init() {} // 存储观察者的字典,键为通知名称,值为观察者数组 private var observers: [String: [(observer: AnyObject, selector: Selector, object: AnyObject?)]] = [:] // 注册观察者的方法 func addObserver(_ observer: AnyObject, selector: Selector, name: String, object obj: AnyObject? = nil) { // 如果字典中不存在该通知名称,则创建一个新的数组 if observers[name] == nil { observers[name] = [] } // 添加观察者到数组中 observers[name]?.append((observer: observer, selector: selector, object: obj)) } // 发布通知的方法 func post(name: String, object obj: AnyObject? = nil, userInfo: [AnyHashable: Any]? = nil) { // 检查是否有观察者注册了该通知 guard let observersForName = observers[name] else { return } // 创建通知对象 let notification = Notification(name: name, object: obj, userInfo: userInfo) // 遍历所有观察者并调用其选择器 for observerInfo in observersForName { // 检查对象是否匹配 if let observerObject = observerInfo.object, let notificationObject = notification.object { if observerObject !== notificationObject { continue } } // 检查观察者是否仍然存在(弱引用可能已被释放) if let observer = observerInfo.observer as? NSObjectProtocol { // 检查选择器是否存在 if observer.responds(to: observerInfo.selector) { // 调用选择器 DispatchQueue.main.async { observer.perform(observerInfo.selector, with: notification) } } } } } // 移除观察者的方法 func removeObserver(_ observer: AnyObject, name: String? = nil, object obj: AnyObject? = nil) { if let name = name { // 如果指定了通知名称,只移除该通知的观察者 if let observersForName = observers[name] { var newObservers: [(observer: AnyObject, selector: Selector, object: AnyObject?)] = [] // 过滤掉要移除的观察者 for observerInfo in observersForName { if observerInfo.observer === observer { continue } newObservers.append(observerInfo) } // 更新观察者数组 if newObservers.isEmpty { observers.removeValue(forKey: name) } else { observers[name] = newObservers } } } else { // 如果没有指定通知名称,移除该观察者的所有注册 for (name, observersForName) in observers { var newObservers: [(observer: AnyObject, selector: Selector, object: AnyObject?)] = [] // 过滤掉要移除的观察者 for observerInfo in observersForName { if observerInfo.observer === observer { continue } newObservers.append(observerInfo) } // 更新观察者数组 if newObservers.isEmpty { observers.removeValue(forKey: name) } else { observers[name] = newObservers } } } } }6.2 Notification类
Notification类用于封装通知的信息,包括通知名称、发送对象和用户信息。
以下是Notification类的简化实现:
// 通知类 class Notification { // 通知名称 let name: String // 发送通知的对象 let object: AnyObject? // 附加的用户信息 let userInfo: [AnyHashable: Any]? // 初始化方法 init(name: String, object: AnyObject? = nil, userInfo: [AnyHashable: Any]? = nil) { self.name = name self.object = object self.userInfo = userInfo } }6.3 使用示例
以下是一个使用自定义通知中心的示例:
// 定义通知名称常量 struct NotificationNames { static let dataUpdated = "DataUpdatedNotification" } // 数据管理器类,作为通知发布者 class DataManager { // 通知中心实例 let notificationCenter = NotificationCenter.defaultCenter // 更新数据的方法 func updateData() { // 模拟数据更新 print("Updating data...") // 数据更新完成后发布通知 notificationCenter.post(name: NotificationNames.dataUpdated, object: self) } } // 视图控制器类,作为通知观察者 class ViewController { // 通知中心实例 let notificationCenter = NotificationCenter.defaultCenter init() { // 注册通知观察者 notificationCenter.addObserver(self, selector: #selector(dataUpdated), name: NotificationNames.dataUpdated) } deinit { // 移除通知观察者 notificationCenter.removeObserver(self) } // 处理通知的方法 @objc func dataUpdated(notification: Notification) { print("Received data updated notification from \(notification.object ?? "unknown")") // 更新UI或执行其他操作 updateUI() } // 更新UI的方法 func updateUI() { // 更新UI的代码 print("Updating UI...") } }七、通知机制的高级特性
7.1 通知名称类型安全
为了提高通知名称的类型安全性,可以使用枚举来定义通知名称。
// 使用枚举定义通知名称 enum AppNotification: String { case dataUpdated = "DataUpdatedNotification" case userLoggedIn = "UserLoggedInNotification" case networkStatusChanged = "NetworkStatusChangedNotification" var name: String { return rawValue } } // 使用枚举通知名称 notificationCenter.post(name: AppNotification.dataUpdated.name, object: self)7.2 基于闭包的通知注册
除了使用选择器,还可以使用闭包来注册通知,使代码更加简洁和类型安全。
// 扩展NotificationCenter添加基于闭包的注册方法 extension NotificationCenter { func addObserver(forName name: String, object obj: AnyObject? = nil, queue: OperationQueue? = nil, using block: @escaping (Notification) -> Void) -> AnyObject { // 创建一个包装对象来存储闭包 let observer = NotificationObserver(center: self, name: name, object: obj, queue: queue, block: block) return observer } } // 通知观察者包装类 private class NotificationObserver { weak var center: NotificationCenter? let name: String let object: AnyObject? let queue: OperationQueue? let block: (Notification) -> Void init(center: NotificationCenter, name: String, object: AnyObject?, queue: OperationQueue?, block: @escaping (Notification) -> Void) { self.center = center self.name = name self.object = object self.queue = queue self.block = block // 注册通知 center.addObserver(self, selector: #selector(handleNotification), name: name, object: object) } deinit { // 移除通知 center?.removeObserver(self) } @objc func handleNotification(notification: Notification) { if let queue = queue { queue.addOperation { [weak self] in self?.block(notification) } } else { block(notification) } } }7.3 线程安全
通知中心在多线程环境中需要确保线程安全,可以使用互斥锁来保护共享资源。
// 线程安全的通知中心 class ThreadSafeNotificationCenter { static let defaultCenter = ThreadSafeNotificationCenter() private init() {} // 使用互斥锁保护共享资源 private let lock = NSLock() // 存储观察者的字典 private var observers: [String: [(observer: AnyObject, selector: Selector, object: AnyObject?)]] = [:] // 注册观察者的方法 func addObserver(_ observer: AnyObject, selector: Selector, name: String, object obj: AnyObject? = nil) { lock.lock() defer { lock.unlock() } if observers[name] == nil { observers[name] = [] } observers[name]?.append((observer: observer, selector: selector, object: obj)) } // 发布通知的方法 func post(name: String, object obj: AnyObject? = nil, userInfo: [AnyHashable: Any]? = nil) { lock.lock() guard let observersForName = observers[name] else { lock.unlock() return } let notification = Notification(name: name, object: obj, userInfo: userInfo) let observersCopy = observersForName lock.unlock() for observerInfo in observersCopy { if let observerObject = observerInfo.object, let notificationObject = notification.object { if observerObject !== notificationObject { continue } } if let observer = observerInfo.observer as? NSObjectProtocol { if observer.responds(to: observerInfo.selector) { DispatchQueue.main.async { observer.perform(observerInfo.selector, with: notification) } } } } } // 移除观察者的方法 func removeObserver(_ observer: AnyObject, name: String? = nil, object obj: AnyObject? = nil) { lock.lock() defer { lock.unlock() } if let name = name { if let observersForName = observers[name] { var newObservers: [(observer: AnyObject, selector: Selector, object: AnyObject?)] = [] for observerInfo in observersForName { if observerInfo.observer === observer { continue } newObservers.append(observerInfo) } if newObservers.isEmpty { observers.removeValue(forKey: name) } else { observers[name] = newObservers } } } else { for (name, observersForName) in observers { var newObservers: [(observer: AnyObject, selector: Selector, object: AnyObject?)] = [] for observerInfo in observersForName { if observerInfo.observer === observer { continue } newObservers.append(observerInfo) } if newObservers.isEmpty { observers.removeValue(forKey: name) } else { observers[name] = newObservers } } } } }八、代理模式与通知机制的比较
8.1 相似之处
8.2 不同之处
- 代理模式是一对一的通信,一个委托者对应一个代理。
- 通知机制是一对多的通信,一个发布者可以对应多个观察者。
- 代理模式的耦合度相对较高,委托者需要知道代理的协议。
- 通知机制的耦合度更低,发布者和观察者不需要直接引用。
- 代理模式适用于需要精确控制和处理特定事件的场景。
- 通知机制适用于广泛传播事件或状态变化的场景。
- 代理模式的实现相对简单,只需要定义协议和实现代理方法。
- 通知机制的实现相对复杂,需要管理观察者的注册和注销。
- 代理模式的性能开销较小,因为是直接调用代理方法。
- 通知机制的性能开销较大,因为需要遍历所有观察者并调用相应方法。
九、代理模式与通知机制的最佳实践
9.1 代理模式的最佳实践
9.2 通知机制的最佳实践
十、代理模式与通知机制的源码深度分析
10.1 Swift标准库中的代理模式实现
在Swift标准库中,有许多地方使用了代理模式。例如,URLSession类就使用了代理模式来处理网络请求的各种事件。
以下是URLSession代理模式的简化实现:
// URLSession代理协议 protocol URLSessionDelegate: AnyObject { func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) } // URLSessionDataDelegate协议,继承自URLSessionDelegate protocol URLSessionDataDelegate: URLSessionDelegate { func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) } // URLSession类 class URLSession { weak var delegate: URLSessionDelegate? // 创建数据任务 func dataTask(with url: URL) -> URLSessionDataTask { return URLSessionDataTask(session: self, url: url) } // 其他方法... } // URLSessionDataTask类 class URLSessionDataTask { private weak var session: URLSession? private let url: URL init(session: URLSession, url: URL) { self.session = session self.url = url } // 启动任务 func resume() { // 实际网络请求代码... // 模拟接收到数据 let data = Data() // 如果代理实现了URLSessionDataDelegate协议,调用相应方法 if let dataDelegate = session?.delegate as? URLSessionDataDelegate { dataDelegate.urlSession(session!, dataTask: self, didReceive: data) } } // 其他方法... }10.2 Swift标准库中的通知机制实现
在Swift标准库中,通知机制的核心是NotificationCenter类。以下是NotificationCenter类的更详细实现分析:
// NotificationCenter类 class NotificationCenter { // 单例实例 static let `default` = NotificationCenter() // 私有初始化方法 private init() {} // 使用互斥锁保护共享资源 private let lock = NSRecursiveLock() // 存储观察者的字典 // 键为通知名称,值为包含观察者信息的数组 private var observers: [Notification.Name: [(observer: AnyObject, block: (Notification) -> Void, object: AnyObject?)]] = [:] // 注册观察者的方法(基于闭包) func addObserver(forName name: Notification.Name, object obj: AnyObject? = nil, queue: OperationQueue? = nil, using block: @escaping (Notification) -> Void) -> Any { lock.lock() defer { lock.unlock() } // 如果字典中不存在该通知名称,创建新的数组 if observers[name] == nil { observers[name] = [] } // 创建一个封装对象,用于在观察者被释放时自动移除通知 let observer = NotificationObserver(center: self, name: name, object: obj) // 添加观察者信息到数组 observers[name]?.append((observer: observer, block: { [weak observer] notification in // 检查观察者是否还存在 if observer != nil { if let queue = queue { queue.addOperation { block(notification) } } else { block(notification) } } }, object: obj)) return observer } // 发布通知的方法 func post(name: Notification.Name, object obj: AnyObject? = nil, userInfo: [AnyHashable: Any]? = nil) { lock.lock() // 创建通知对象 let notification = Notification(name: name, object: obj, userInfo: userInfo) // 获取该通知名称的所有观察者 guard let observersForName = observers[name] else { lock.unlock() return } // 复制观察者数组,避免在遍历过程中修改 let observersCopy = observersForName lock.unlock() // 遍历所有观察者并调用其闭包 for observerInfo in observersCopy { // 检查对象是否匹配 if let observerObject = observerInfo.object, let notificationObject = notification.object { if observerObject !== notificationObject { continue } } // 调用闭包 observerInfo.block(notification) } } // 移除观察者的方法 func removeObserver(_ observer: Any) { lock.lock() defer { lock.unlock() } // 遍历所有通知名称 for (name, observersForName) in observers { // 过滤掉要移除的观察者 let newObservers = observersForName.filter { $0.observer !== observer } // 更新观察者数组 if newObservers.isEmpty { observers.removeValue(forKey: name) } else { observers[name] = newObservers } } } // 内部类,用于在观察者被释放时自动移除通知 private class NotificationObserver { weak var center: NotificationCenter? let name: Notification.Name let object: AnyObject? init(center: NotificationCenter, name: Notification.Name, object: AnyObject?) { self.center = center self.name = name self.object = object } deinit { // 观察者被释放时,自动从通知中心移除 center?.removeObserver(self) } } } // Notification类 class Notification { // 通知名称 let name: Name // 发送通知的对象 let object: AnyObject? // 附加的用户信息 let userInfo: [AnyHashable: Any]? // 通知名称类型 struct Name: RawRepresentable, Hashable { let rawValue: String init(rawValue: String) { self.rawValue = rawValue } static func == (lhs: Name, rhs: Name) -> Bool { return lhs.rawValue == rhs.rawValue } func hash(into hasher: inout Hasher) { hasher.combine(rawValue) } } // 初始化方法 init(name: Name, object: AnyObject? = nil, userInfo: [AnyHashable: Any]? = nil) { self.name = name self.object = object self.userInfo = userInfo } }十一、代理模式与通知机制的性能分析
11.1 代理模式的性能分析
代理模式的性能开销主要来自以下几个方面:
在大多数情况下,代理模式的性能开销是可以忽略不计的。只有在高频率调用代理方法的场景下,才需要考虑性能优化。
11.2 通知机制的性能分析
通知机制的性能开销主要来自以下几个方面:
通知机制的性能开销相对较大,尤其是在观察者数量较多或频繁发布通知的场景下。因此,应该谨慎使用通知机制,避免不必要的性能损耗。
11.3 性能优化建议
十二、代理模式与通知机制的常见问题与解决方案
12.1 代理模式的常见问题与解决方案
- 问题:委托者和代理之间可能形成强引用循环,导致内存泄漏。
- 解决方案:在委托者中使用弱引用(weak)引用代理。
- 问题:如果代理没有实现某个必需的方法,调用该方法会导致崩溃。
- 解决方案:使用可选方法(@objc optional),并在调用前检查方法是否被实现。
- 问题:当代理协议的方法参数发生变化时,需要修改所有实现该协议的类。
- 解决方案:使用泛型或封装参数对象,减少接口变化对实现类的影响。
12.2 通知机制的常见问题与解决方案
- 问题:如果观察者在销毁前没有移除注册的通知,可能导致野指针异常。
- 解决方案:在观察者的deinit方法中移除所有注册的通知,或使用自动移除机制。
- 问题:不同模块可能使用相同的通知名称,导致意外的通知接收。
- 解决方案:使用命名空间或枚举来组织通知名称,确保唯一性。
- 问题:过多的观察者或频繁发布通知可能导致性能下降。
- 解决方案:减少观察者数量,避免频繁发布通知,优化通知中心实现。
- 问题:在多线程环境中,通知中心的操作可能导致数据竞争。
- 解决方案:使用适当的线程同步机制(如锁)保护共享资源。
十三、代理模式与通知机制的应用案例
13.1 代理模式的应用案例
- 在iOS开发中,许多UI控件使用代理模式处理用户交互。例如,UITableView和UICollectionView使用代理模式来处理单元格的选择、滚动等事件。
- 网络请求类可以使用代理模式将请求结果返回给调用者。例如,一个自定义的网络请求类可以定义一个代理协议,当请求完成时调用代理的相应方法。
- 当开发自定义UI控件时,可以使用代理模式让控件的使用者能够处理特定的事件。例如,一个自定义的下拉刷新控件可以通过代理通知使用者刷新事件。
13.2 通知机制的应用案例
- iOS系统提供了许多通知,用于通知应用关于系统状态的变化。例如,UIDeviceOrientationDidChangeNotification通知应用设备方向发生了变化。
- 在大型应用中,不同模块之间可能需要通信。例如,用户登录模块在用户登录成功后可以发布一个通知,其他模块可以监听这个通知并做出相应的处理。
- 当应用的某个核心状态发生变化时,可以使用通知机制通知所有感兴趣的模块。例如,应用的网络状态发生变化时,可以发布一个通知,让所有需要知道网络状态的模块更新UI。
十四、代理模式与通知机制的未来发展
14.1 代理模式的未来发展
- 随着Swift语言的发展,代理模式可能会与新的语言特性(如泛型、协议扩展等)更紧密地融合,提供更强大、更灵活的功能。
- 未来可能会出现工具或库,能够根据定义的协议自动生成代理实现代码,减少手动编写的工作量。
- 可能会引入更强大的类型系统特性,进一步提高代理模式的类型安全性,减少运行时错误。
14.2 通知机制的未来发展
- 随着对性能要求的提高,通知机制的实现可能会更加高效,减少内存占用和提高处理速度。
- 未来可能会引入类型安全的通知机制,避免使用字符串作为通知名称,提高代码的安全性和可维护性。
- 通知机制可能会与Swift的异步编程模型更紧密地集成,提供更简洁、更安全的异步通知处理方式。
- 可能会开发出更强大的可视化调试工具,帮助开发者更直观地理解和调试通知机制的使用。
代理模式(静态代理模式、动态代理模式、cgLib代理模式、拦截器)动态代理模式
设计模式之代理模式、动态代理模式、Cglib代理模式动态代理是代理模式吗
代理模式-静态代理模式 代理模式-动态代理(基于接口,JDK动态代理)动态代理是代理模式吗
【设计模式】代理模式 ( 代理模式结构 | 客户端 | 主题对象 | 被代理对象 | 代理对象 )设计模式的代理模式
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )动态代理是代理模式吗
设计模式之代理模式(包含静态代理和动态代理)设计模式的代理模式
【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )设计模式的代理模式