代理模式是指结构设计模式。
该模式描述了通过类层处理类的技术——代理人。代理允许您更改原始类的功能,并且能够保留原始行为,同时维护原始类接口。
让我们想象一下这种情况– 2015年,西欧国家之一决定记录该国用户网站的所有请求,以改进统计并深入了解公民的政治情绪。
让我们想象一下公民用来访问互联网的网关的简单实现的伪代码:
class InternetRouter {
private let internet: Internet
init(internet: Internet) {
self.internet = internet
}
func handle(request: Request, from client: Client) -> Data {
return self.internet.handle(request)
}
}
在上面的代码中,我们创建了一个 Internet 路由器类,其中包含一个指向提供 Internet 访问的对象的指针。当客户发出网站请求时,我们会从互联网返回响应。
使用代理模式和单例反模式,我们将添加用于记录客户端名称和 URL 的功能:
class InternetRouterProxy {
private let internetRouter: InternetRouter
init(internet: Internet) {
self.internetRouter = InternetRouter(internet: internet)
}
func handle(request: Request, from client: Client) -> Data {
Logger.shared.log(“Client name: \(client.name), requested URL: \(request.URL)”)
return self.internetRouter.handle(request: request, from: client)
}
}
由于代理类InternetRouterProxy中保留了原始InternetRouter接口,因此只需将InternerRouter中的初始化类替换为其代理即可,无需进一步更改代码库。
来源
https://refactoring.guru/ru/design-patterns/代理