不得不说的结构型模式-代理模式

目录

代理模式:

下面是一个简单的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. 1什么是代理模式?它的主要作用是什么?

答:代理模式是一种结构型设计模式,用于为另一个对象提供一个替代品或占位符,以控制对该对象的访问。代理对象充当原始对象的中介,通过拦截对原始对象的访问来提供额外的功能或限制访问。代理模式的主要作用是增强对象的功能,保护对象的访问,以及实现延迟加载等功能。

  1. 2代理模式有哪些常见的应用场景?

答:代理模式在很多应用中都有广泛的应用,其中一些常见的应用场景包括:

  • 远程代理:将远程对象封装在代理对象中,使得客户端可以通过网络访问远程对象。
  • 虚拟代理:用于延迟加载,当对象的创建成本很高时,可以使用虚拟代理在需要时才创建对象。
  • 安全代理:控制对原始对象的访问,限制客户端的访问权限。
  • 智能代理:提供额外的功能,如缓存、日志、事务管理等。
  1. 3代理模式和适配器模式有何区别?

答:代理模式和适配器模式都是结构型设计模式,但它们的主要目的不同。代理模式是为了增强对象的功能,保护对象的访问,以及实现延迟加载等功能,而适配器模式是为了将一个接口转换为另一个接口,以便让不兼容的类能够合作工作。在代理模式中,代理对象和原始对象通常具有相同的接口,而在适配器模式中,适配器对象和被适配对象通常具有不同的接口。

此外,在代理模式中,代理对象通常可以控制对原始对象的访问,可以拦截和过滤一些方法调用,而在适配器模式中,适配器对象主要是为了兼容不同的接口而存在,不涉及控制访问和拦截调用等功能。

  1. 4代理模式有哪些缺点?

答:代理模式虽然可以提供额外的功能和保护对象的访问,但同时也会带来一些缺点,其中一些常见的缺点包括:

  • 代理模式会增加系统的复杂性,引入了更多的对象和间接层,增加了代码的维护难度。
  • 代理模式可能会降低系统的性能,由于代理对象需要进行额外的处理和转发,因此会产生额外的开销和延迟。
  • 代理模式可能会引入新的安全问题,由于代理对象可以控制对原始对象的访问,因此需要谨慎处理代理对象的安全性和可信度。

总的来说,代理模式是一种非常常用的设计模式,可以在不改变原始对象的情况下对其进行访问控制、增加额外的功能等。在实际的软件开发中,代理模式也被广泛应用,如数据库连接池、远程代理等场景中都可以使用代理模式来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值