代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

介绍

意图:为其他对象提供一种代理以控制对这个对象的访问。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

何时使用:想在访问一个类时做一些控制。

如何解决:增加中间层。

关键代码:实现与被代理类组合。

应用实例: 1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring aop。

优点: 1、职责清晰。 2、高扩展性。 3、智能化。

缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

 #include<iostream>
#include<string>
class SchoolGirl{
private :
std::string name;
public:
void setName(std::string name){
this->name = name;
}
std::string getName(){
return name;
}
}; //接口
class IGiveGift{
public:
virtual void GiveDolls(){};
virtual void GiveFlowers(){};
virtual void GiveChocolate(){}; };
// 真正的追求者
class Pursuit :public IGiveGift{
private:
SchoolGirl* realPursuit;
public:
Pursuit(SchoolGirl* realPursuit){
this->realPursuit = realPursuit;
}
void GiveDolls(){
std::cout << realPursuit->getName() << " give u Dolls" << std::endl; }
void GiveFlowers(){
std::cout << realPursuit->getName() << " give u Flowers" << std::endl;
}
void GiveChocolate(){
std::cout << realPursuit->getName() << " give u Chocolates" << std::endl;
}
}; //代理者
class Proxy :public IGiveGift{
private:
Pursuit* proxyPursuit;//OBJ
public:
Proxy(SchoolGirl* realPursuit){
proxyPursuit = new Pursuit(realPursuit);
}
void GiveDolls(){
proxyPursuit->GiveDolls();
}
void GiveFlowers(){
proxyPursuit->GiveFlowers();
}
void GiveChocolate(){
proxyPursuit->GiveChocolate();
}
}; void main(){
SchoolGirl* jiaojiao = new SchoolGirl();
jiaojiao->setName("lijiaojiao");
Proxy* proxy = new Proxy(jiaojiao);
proxy->GiveDolls();
proxy->GiveFlowers();
proxy->GiveChocolate();
delete jiaojiao;
jiaojiao = NULL;
delete proxy;
proxy = NULL;
system("pause"); }

参考:

https://blog.csdn.net/xiqingnian/article/details/41970165

http://www.runoob.com/design-pattern/proxy-pattern.html

《大话设计模式》c++实现 代理模式的更多相关文章

  1. 大话设计模式C++版——代理模式

    本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng9 ...

  2. 大话设计模式Python实现-代理模式

    代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = ...

  3. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  4. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  5. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  6. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  7. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  8. 大话设计模式C++版——工厂模式在COM中的典型应用

    上篇<大话设计模式C++版——抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式 ...

  9. 【读书笔记】读《JavaScript设计模式》之代理模式

    一.定义 代理是一个对象,它可以用来控制对另一个对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替其实体被实例化,并使其可被远程访 ...

  10. php设计模式之Proxy(代理模式)和Facade(外观)设计模式

    Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...

随机推荐

  1. python找出数组中第二大的数

    #!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:找出数组中第2大的数字 ''' def find_Second_large_ ...

  2. elasticsearch解决控制台中文乱码问题

    找到conf目录下的jvm.options文件,找到如下的配置行: 我将之前的UTF-8 改成GBK,ok.

  3. linux 模拟发http请求的例子

    curl -X POST --header "Content-Type: application/json" --header "Accept: */*" &q ...

  4. 机器学习:K-Means/K-Means++

  5. You-Get——基于Python3的媒体下载工具

    You-Get是一个基于 Python 3 的下载工具.使用 You-Get 可以很轻松的下载到网络上的视频.图片及音乐. 项目主页:https://github.com/soimort/you-ge ...

  6. StringDemo

    package cn.sasa.demo2; public class StringDemo { public static void main(String[] args) { //String 底 ...

  7. centos安装Django之四:安装Django

    前面我们学会了centos安装Django之一:安装openssl和centos安装Django之二:pip3安装,centos安装Django之三:安装python,现在我们就可以安装Django了 ...

  8. 报错解决——Disconnected:No supported authentication methods available

    该问题是由于ssh链接未允许远程密码认证导致的 解决方法 通过管理控制台进入系统,查看 /etc/ssh/sshd_config配置文件中是否包含以下配置 PasswordAuthentication ...

  9. idea-常用插件-nginx

    1.mac上nginx安装 brew search nginx brew install nginx 当然也可以编译安装 安装完以后,可以在终端输出的信息里看到一些配置路径: /usr/local/e ...

  10. [py]super调用父类的方法---面向对象

    super()用于调用父类方法 http://www.runoob.com/python/python-func-super.html super() 函数是用于调用父类(超类)的一个方法. clas ...