栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++设计模式 代理模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++设计模式 代理模式

文章目录
  • 1. 代理模式的理论
    • 1.1 应用场景
  • 2. 逻辑代码
  • 3. 具体应用

1. 代理模式的理论 1.1 应用场景
  • 远程代理: 为一个对象在不同地址空间提供局部代表, 这样就可以隐藏一个对象存在于不同地址空间的事实 比如引用web时, 代理会在项目中生成一个webReference文件夹和一些文件, 使得客户端程序调用代理就可以解决远程访问问题
  • 虚拟代理: 是根据需要创建开销很大的对象, 通过他来存放实例化需要很长时间的真实对象 比如打开一个很大的的HTML页面, 里面有很多文字和图片, 但是我们还能很快打开, 此时所能看到所有的文字, 但是图片确实一张张下载后才能看见, 那些未打开的图片框, 就是通过虚拟代理代替了真实图片, 此时代理只存储了图片的路径和尺寸
  • 安全代理: 用来控制真实对象访问时的权限 一般用于对象应该有不同访问权限时
  • 智能指引: 当调用真实对象时, 代理处理另外一些事情 如计算真实对象的引用次数, 这样改对象没有引用时, 就可以自动释放他, 智能指针就是这样子
2. 逻辑代码

  • Subject类 定义了RealSubject和Proxy公共接口
  • 这样 realSubject 在任何地方都能调用Proxy
  • RealSubject 定义Proxy 所代表的真实实体
  • Proxy 保存引用, 使得代理可以访问实体, 提供一个与Subject接口相同的接口
class Subject{
public:
    virtual void request() = 0;
};

class RealSubject : public Subject{
public:
    void request(){
        cout << "真实的请求" <request();
    }
    ~Proxy(){
        if(realSubject != nullptr){
            delete realSubject;
        }
    }
};

int main(int argc, char const *argv[])
{
    Proxy * proxy = new Proxy();
    proxy->request();
    delete proxy;
    return 0;
}
3. 具体应用

代理模式其实就是 A想追求C, 但是A通过B先给C送礼物, 这个B就是代理人

具体实现

// 女孩
class Girl{
public:
    // Girl(){}
    Girl(string name): name(name){}
    string getName(){
        return name;
    }

private:
    string name;
};


// 代理接口
class GiveGift{
public:
    virtual void GiveDolls()=0;
    virtual void GiveFlowers()=0;
    virtual void GiveChocolates()=0;
};

// 追求者A类
class Pursuit: public GiveGift{
protected:
    Girl *mm = nullptr;

public:
	~Pursuit(){
		if(mm != nullptr) delete mm;
	}
    Pursuit(Girl *mm): mm(mm){} // 追求者初始化的时候就应该有喜欢的对象才对

    void GiveDolls(){
        cout << mm->getName() << " 送你洋娃娃" <getName() << " 送你花花花" <getName() << " 送你巧克力" <GiveDolls();
    }

    void GiveFlowers(){
        gg->GiveFlowers();
    }

    void GiveChocolates(){
        gg->GiveChocolates();
    }
};

int main(int argc, char const *argv[])
{
    Girl *hx = new Girl("hx");
    Proxy *d1 = new Proxy(hx);
    d1->GiveChocolates();
    d1->GiveDolls();
	delete hx, d1;
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289763.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号