zoukankan      html  css  js  c++  java
  • [大话设计模式] 第7章: 代理模式

    代理模式(Proxy)

    • 代理模式:为其他对象提供一种代理以控制对这个对象的访问。实际上是在访问对象时引入一定程度的间接性。
    • 远程代理:为一个对象在不同地址空间提供局部代表,隐藏一个对象存在于不同空间的事实。如.Net加入Web引用,引入WebService,此时项目会生成WebReference的文件夹,就是代理。
    • 虚拟代理:根据需要创建开销很大的对象,通过它存放实例化需很长时间的真实对象。HTML中的多图,就是通过虚拟代理代替了真实图片,存储路径和尺寸。
    • 安全代理:控制真实对象的访问权限,用于对象应该拥有不同的访问权限时。
    • 智能指引:当调用真实对象时,代理处理一些另外的事情。通过代理在访问对象时增加一些内务处理。

    UML类图

    ### 实例分析

    场景描述: 某追求者(Pursuit类)追求女同学(SchoolGirl类), 但是由于不在一个班不能直接给女同学送礼物, 需要一个代理(Proxy类)帮忙送礼物.

    UML类图

    代码实现

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    // 被追求者类
    class SchoolGirl
    {
    public:
    	SchoolGirl() {}
    	SchoolGirl(string n) : name(n){}
    	string get_name(){ return name; }
    private:
    	string name;
    };
    
    // 代理与追求者公共接口
    class IGiveGift
    {
    public:
    virtual void give_dolls() = 0;
    virtual void give_flowers() = 0;
    virtual void give_chocolate() = 0;	
    };
    
    // 追求者类
    class Pursuit : public IGiveGift
    {
    public:
    	Pursuit(SchoolGirl *sg) : mm(sg){ }
    	void give_dolls();
    	void give_flowers();
    	void give_chocolate();
    private:
    	SchoolGirl *mm;
    };
    
    
    void Pursuit::give_dolls()
    {
    	cout << "Give dolls to " << mm->get_name() << endl;
    }
    void Pursuit::give_flowers()
    {
    	cout << "Give flowers to " << mm->get_name() << endl;
    }
    void Pursuit::give_chocolate()
    {
    	cout << "Give chocolate to " << mm->get_name() << endl;
    }
    
    // 代理类
    class Proxy : public IGiveGift
    {
    public:
    	Proxy(SchoolGirl *mm);
    	~Proxy();
    	void give_dolls();
    	void give_flowers();
    	void give_chocolate();
    private:
    	Pursuit *gg;
    };
    
    Proxy::Proxy(SchoolGirl *mm)
    {
    	gg = new Pursuit(mm);
    }
    Proxy::~Proxy()
    {
    	delete gg;
    }
    
    void Proxy::give_dolls()
    {
    	gg->give_dolls();
    }
    void Proxy::give_flowers()
    {
    	gg->give_flowers();
    }
    void Proxy::give_chocolate()
    {
    	gg->give_chocolate();
    }
    
    // 客户端
    int main()
    {
    	SchoolGirl s_girl("娇娇");
    	Proxy daili(&s_girl);
    	daili.give_flowers();
    	daili.give_dolls();
    	daili.give_chocolate();
    
    	return 0;
    }
    
    /* 输出
    Give flowers to 娇娇
    Give dolls to 娇娇
    Give chocolate to 娇娇
    */
    
  • 相关阅读:
    (转)读《从0到1》
    做事需要愿景,产品都是人思想的投射
    sed 替换有单引号的行
    删除iptables nat 规则
    解决yum安装 openssl-devel时产生的Multilib version problems found错误(转)
    docker 私有仓库 harbor docker-compose
    kubernetes 比较好的案例-创建tomcat-mysql集群 mysql.yaml + workpress.yaml
    配虚拟ip脚本
    kubenetes 1.9 学习 pod
    解决sql和beans中名字不一致问题
  • 原文地址:https://www.cnblogs.com/moon1992/p/7374342.html
Copyright © 2011-2022 走看看