目录
代理模式:
下面是一个简单的C++代码案例
下面是面试中可能遇到的问题:
代理模式:
代理模式是一种结构型设计模式,它通过引入一个代理对象来控制对另一个对象的访问。代理对象充当原始对象的中介,通过拦截对原始对象的访问来提供额外的功能或限制访问。
在代理模式中,通常有三个角色:
- 抽象主题(Subject):定义了代理对象和原始对象的公共接口,是代理对象和原始对象的公共父类或接口。
- 真实主题(RealSubject):定义了代理对象所代表的真实对象,是代理对象所包装的对象。
- 代理(Proxy):定义了代理对象,并持有一个指向真实主题对象的引用,同时实现了与抽象主题相同的接口。
代理对象通常在访问原始对象之前和之后执行额外的处理,如记录日志、控制访问权限、缓存数据等。代理对象还可以通过控制对原始对象的访问来实现一些特殊的功能,如延迟加载、数据过滤等。
下面是一个简单的C++代码案例
以下是一个简单的C++代理模式代码示例,假设我们有一个接口类 Subject 和一个实现类 RealSubject,我们可以通过代理类 Proxy 来访问 RealSubject 对象,并实现额外的功能。
#include <iostream>
#include <string>
using namespace std;
// 抽象主题
class Subject {
public:
virtual void request() = 0;
};
// 真实主题
class RealSubject : public Subject {
public:
void request() override {
cout << "RealSubject: handling request." << endl;
}
};
// 代理
class Proxy : public Subject {
private:
RealSubject* realSubject_;
void checkAccess() const {
cout << "Proxy: checking access prior to request." << endl;
}
void logAccess() const {
cout << "Proxy: logging request." << endl;
}
public:
Proxy(RealSubject* realSubject) : realSubject_(realSubject) {}
void request() override {
checkAccess();
realSubject_->request();
logAccess();
}
};
// 客户端代码
int main() {
RealSubject* realSubject = new RealSubject();
Proxy* proxy = new Proxy(realSubject);
proxy->request();
delete proxy;
delete realSubject;
return 0;
}
在上面的代码中,RealSubject 类表示真实的主题,实现了抽象主题 Subject 的接口。Proxy 类表示代理对象,它也实现了抽象主题 Subject 的接口,并持有一个指向真实主题对象的引用。在 Proxy 类中,我们可以实现一些额外的功能,如控制访问权限、记录日志等。
在客户端代码中,我们创建了一个 RealSubject 对象和一个 Proxy 对象,并通过调用 Proxy 对象的 request() 方法来访问 RealSubject。
在上述代码中,Proxy 类作为 RealSubject 的代理对象,通过实现 request() 方法来代理 RealSubject 的 request() 方法。在 request() 方法中,Proxy 对象会先进行一些额外的处理,如检查访问权限和记录日志,然后再调用 RealSubject 对象的 request() 方法,最后再进行一些额外的处理。
当客户端代码调用 Proxy 对象的 request() 方法时,实际上是通过代理对象来访问真实主题对象的 request() 方法。这种方式可以让我们控制对真实主题对象的访问,从而实现一些特殊的功能,如权限控制、数据过滤等。
下面是面试中可能遇到的问题:
- 1什么是代理模式?它的主要作用是什么?
答:代理模式是一种结构型设计模式,用于为另一个对象提供一个替代品或占位符,以控制对该对象的访问。代理对象充当原始对象的中介,通过拦截对原始对象的访问来提供额外的功能或限制访问。代理模式的主要作用是增强对象的功能,保护对象的访问,以及实现延迟加载等功能。
- 2代理模式有哪些常见的应用场景?
答:代理模式在很多应用中都有广泛的应用,其中一些常见的应用场景包括:
- 远程代理:将远程对象封装在代理对象中,使得客户端可以通过网络访问远程对象。
- 虚拟代理:用于延迟加载,当对象的创建成本很高时,可以使用虚拟代理在需要时才创建对象。
- 安全代理:控制对原始对象的访问,限制客户端的访问权限。
- 智能代理:提供额外的功能,如缓存、日志、事务管理等。
- 3代理模式和适配器模式有何区别?
答:代理模式和适配器模式都是结构型设计模式,但它们的主要目的不同。代理模式是为了增强对象的功能,保护对象的访问,以及实现延迟加载等功能,而适配器模式是为了将一个接口转换为另一个接口,以便让不兼容的类能够合作工作。在代理模式中,代理对象和原始对象通常具有相同的接口,而在适配器模式中,适配器对象和被适配对象通常具有不同的接口。
此外,在代理模式中,代理对象通常可以控制对原始对象的访问,可以拦截和过滤一些方法调用,而在适配器模式中,适配器对象主要是为了兼容不同的接口而存在,不涉及控制访问和拦截调用等功能。
- 4代理模式有哪些缺点?
答:代理模式虽然可以提供额外的功能和保护对象的访问,但同时也会带来一些缺点,其中一些常见的缺点包括:
- 代理模式会增加系统的复杂性,引入了更多的对象和间接层,增加了代码的维护难度。
- 代理模式可能会降低系统的性能,由于代理对象需要进行额外的处理和转发,因此会产生额外的开销和延迟。
- 代理模式可能会引入新的安全问题,由于代理对象可以控制对原始对象的访问,因此需要谨慎处理代理对象的安全性和可信度。
总的来说,代理模式是一种非常常用的设计模式,可以在不改变原始对象的情况下对其进行访问控制、增加额外的功能等。在实际的软件开发中,代理模式也被广泛应用,如数据库连接池、远程代理等场景中都可以使用代理模式来实现。