设计模式:代理

设计模式:代理

试想这样一个场景:有一天小菜想给女神进行表白,送一个礼物给女神。但是小菜十分害羞,所以就找了一个代理来代替自己做这些事情。这种模式就是我们常用的代理模式。

结构图

在这里插入图片描述
首先可以发现将追求者希望实现的功能都抽象为一个接口。然后使得代理都实现这些功能,代理当中需要有一个追求者的对象,在自己的功能函数当中,调用追求者对象的功能函数。这样在外部看来,代理能够伪装成为追求者实现相关的功能。


一些思考
其实代理的作用可以伪装成为一个实际的追求者(数据库之类),使得所有人调用的时候都去访问代理,代理可以做一些控制校验的操作,来保证请求的合理性。

代码

送礼物接口(subject)

//接口;真实的数据库和代理数据都依赖这个接口
class GivePresent {
public:
    virtual void request() const = 0;
};

小菜 (realsubject)

class Pursuer :public GivePresent {
public:
    virtual void request() const  override {
        std::cout << "送出礼物\n";
    }

};

代理(Proxy)

class ProxyDatabase :public GivePresent {
private:
    Pursuer* m_pursuer;
    bool checkAccess() const {
        //std::cout << "代理在发出请求之前,检查一下是否合理\n";
        return true;
    }
    void log() const {
        //std::cout << "日志\n";
    }

public:
    ProxyDatabase(Pursuer* pursuer) :m_pursuer(pursuer) {}
    void request() const override {
        if (checkAccess()) {
            //std::cout << "通过代理处理请求\n";
            m_pursuer->request();
            log();
        }
        else {
            //std::cout << "不合理请求进行驳回\n";
        }
    }
};

主函数

void clientCode(const GivePresent* givepresent) {
    givepresent->request();
}
int main()
{
    std::cout << "不使用代理直接进行请求\n";
    Pursuer zjy; // 卓贾易
    clientCode(&zjy); 
    std::cout << "通过代理进行送礼物\n";
    ProxyDatabase dl(&zjy); //代理
    clientCode(&dl);
}

结果

在这里插入图片描述


总结

今天解决了小菜找女朋友的问题,真是开心的一天啊。现在本菜要去骑车了。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值