2. 代理模式(C++)
1.介绍
代理模式:为其他对象提供一种代理以控制对这个对象的访问。这样实现了业务和核心功能分离。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的优点:1.职责清晰;2.易扩展;3.减低耦合,可以保护目标对象。
代理模式的缺点:1.由于在客户端和真实对象之间增加了代理对象,因此可能会造成额外的开销或者请求处理速度变慢;2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
代理模式其实只是加强了对接口的管理,并不是为了修改或则增强接口功能,这是和适配器模式、装饰模式的主要区别。
2. UML
简单的UML图可以表示如下:
- Subject(抽象主题):声明了 RealSubject 与 Proxy 的共同接口;
- RealSubject(真实主题):执行具体的业务逻辑,Proxy 控制对它的访问;
- Proxy(代理):持有一个 RealSubject 引用(指针),可以在需要时将请求转发给 RealSubject,以此起到代理的作用;
- Client(客户端):调用方。
3. 实现
一个简单的实现:
#include <iostream>
#include <memory>
class Subject {
public:
virtual ~Subject() {}
virtual void Request() = 0;
};
class RealSubject: public Subject{
public:
void Request() {
std::cout << "RealSubject::Request()..." << std::endl;
}
};
class Proxy: public Subject{
public:
Proxy(std::shared_ptr<Subject> subject): subject_(subject) {}
~Proxy() {}
void Request() {
std::cout << "Proxy::Request()..." << std::endl;
if(subject_) {
subject_->Request();
} else {
std::cout << "Invalid real subject!" << std::endl;
}
}
private:
std::shared_ptr<Subject> subject_;
};
int main() {
Proxy proxy(std::make_shared<RealSubject>());
proxy.Request();
return 0;
}