设计模式(12)-代理模式及实现

设计模式(12)-代理模式及实现


基本概念

提供了一个代理对象,它充当了原始对象的替代品,以控制对原始对象的访问。代理对象与原始对象实现相同的接口,使得客户端可以无缝地切换和使用。代理对象可以对客户端的请求进行拦截、修改或增强,然后将请求传递给原始对象。
优点:
● 远程代理(Remote Proxy): 代理对象可以隐藏原始对象存在于远程服务器上的事实,使得客户端可以透明地访问远程对象。这对于分布式系统非常有用。
● 虚拟代理(Virtual Proxy): 当创建原始对象需要大量资源时,代理对象可以充当一个轻量级的替代品,延迟原始对象的实际创建和初始化,从而提高性能。
● 保护代理(Protection Proxy): 代理对象可以控制对原始对象的访问权限,确保只有具有特定权限的客户端可以访问原始对象。
● 缓存代理(Cache Proxy): 代理对象可以缓存原始对象的结果,以便在后续相同请求时能够直接返回缓存的结果,减少重复计算。
● 日志记录代理(Logging Proxy): 代理对象可以在访问原始对象之前或之后记录日志,用于调试、监控或审计。

https://gitee.com/want-to-lose-another-30-jin/design-pattern-implementation

设计模式具体实现


角色

1、主题(Subject):

定义了真实对象和代理对象的共同接口,这样代理就可以在任何期望真实对象出现的地方使用。
2、真实主题(Real Subject):

定义了代理所代表的真实对象,实现了真实的业务逻辑。
3、代理(Proxy):

包含对真实主题的引用,提供与真实主题相同的接口,并控制对真实主题的访问。代理可以在访问真实主题之前或之后添加额外的处理逻辑。

java实现

package shejimoshi.dailimoshi;
// 主题接口
public interface Subject {
    void request();
}


package shejimoshi.dailimoshi;
// 真实主题
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }

}


package shejimoshi.dailimoshi;
// 代理
public class Proxy implements Subject {
    private RealSubject realSubject;

    public Proxy() {
        this.realSubject = null;
    }

    public void setRealSubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        System.out.println("Proxy: Logging before request.");
        realSubject.request();
        System.out.println("Proxy: Logging after request.");
    }
}


package shejimoshi.dailimoshi;

public class client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request(); // 使用代理访问真实主题
    }
}


c++实现

#include<iostream>
// 主题接口
class Subject {
public:
    virtual ~Subject() {}
    virtual void request() = 0;
};

// 真实主题
class RealSubject : public Subject {
public:
    void request() override {
        std::cout << "RealSubject: Handling request." << std::endl;
    }
};

// 代理
class Proxy : public Subject {
private:
    RealSubject* realSubject;

public:
    Proxy() : realSubject(nullptr) {}

    ~Proxy() {
        delete realSubject;
    }

    void setRealSubject(RealSubject* rs) {
        realSubject = rs;
    }

    void request() override {
        if (realSubject == nullptr) {
            realSubject = new RealSubject();
        }
        std::cout << "Proxy: Logging before request." << std::endl;
        realSubject->request();
        std::cout << "Proxy: Logging after request." << std::endl;
    }
};

// 客户端
int main() {
    Proxy* proxy = new Proxy();
    proxy->request(); // 使用代理访问真实主题
    delete proxy;
    return 0;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值