当前位置: 首页 > wzjs >正文

移动电子商务网站建设百度手机助手下载2022新版

移动电子商务网站建设,百度手机助手下载2022新版,单页式网站模板,青海网站建设公司电话前面介绍了工厂模式控制了智能指针和资源对象的创建过程,现在介绍一下智能指针是如何利用代理模式来实现“类指针(like-pointer)”的功能,并控制资源对象的销毁过程的。 2、代理模式 代理模式是为其它对象提供一种代理以控制对这…

前面介绍了工厂模式控制了智能指针和资源对象的创建过程,现在介绍一下智能指针是如何利用代理模式来实现“类指针(like-pointer)”的功能,并控制资源对象的销毁过程的。

2、代理模式

代理模式是为其它对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不直接引用另一个对象,而是通过一个代理对象在客户端和目标对象之间起到中介的作用,这个代理对象提供了和目标对象完全一样的功能接口,客户端访问这个代理对象就像是在访问目标对象一样,同时代理对象根据需要在访问目标对象时进行了控制。智能指针就起到了客户端和裸指针的中介代理作用。

按照GOF的说法,组成代理模式的角色有:
主题角色(Subject):定义了代理角色和真实角色的共用接口方法,这样在任何使用真实角色的地方都有可以使用代理角色。
代理角色(Proxy):实现主题角色接口方法,是真实角色的代理,通过真实角色的业务逻辑方法来实现主题角色的接口方法,并可以附加自己的操作,对真实角色的行为进行控制。
真实角色(RealSubject):实现主题角色接口方法,定义了真实角色所要实现的业务逻辑,供代理角色调用。

代理模式的类结构如下图所示:
在这里插入图片描述

智能指针使用面向对象技术封装了C++中的裸指针,是裸指针的包装类,它按照RAII惯用法来管理指针资源,可以在失去生存期时同时把所管理的资源释放掉,得益于C++的操作符重载,智能指针提供了*、->等操作符,它的行为就像是指针,可以按照指针的形式来对智能指针对象进行操作,比如使用“*”操作符来解引用所指向的内容,使用“->”操作符来访问所指向的结构对象的成员,就像是在操作一个普通指针一样。

我们不妨脑洞大开一下,如果把“指针”当作是一种对象,使用面向对象进行设计的话,可以大体定义成类似下面的class:

template<typename T>
class pointer {
private:T *address; // 数据成员public:pointer(T *p);// 下面是成员函数T *operator++();T *operator--();T *operator+=(int offset);T *operator-=(int offset);T operator*();T operator[int index];T *operator->();delete();
}

再看unique_ptr和shared_ptr类,可以把它们当作是pointer基类的派生类,它们提供了pointer定义的成员方法,并且还包含了一个pointer指针。

以shared_ptr为例,可以视为下面的class:

class shared_ptr : public pointer {
private:pointer ptr; // 资源对象指针,指向被代理对象ref_count *refcnt; // 引用计数
public:shared_ptr(pointer p) {...其它操作ptr = p;}T operator*() {return *ptr;}T *operator->() {return ptr;}~shared_ptr() {...其它操作ptr->delete();}...其它成员函数
}

从类的结构形式上看,shared_ptr类继承于pointer类,并且拥有一个pointer类型的数据成员,正好符合代理模式的类结构图:基类pointer对应subject主题类,而shared_ptr类对应proxy代理类,shared_ptr还包含了一个类型为基类pointer的数据成员ptr,即被代理对象,在实践中就是裸指针。再看shared_ptr的功能,它public继承了pointer类,因此它对外提供了pointer类的接口,例如解引用操作符*和成员访问操作符->,当调用shared_ptr的这些接口时,它会把请求转发到数据成员ptr的对应接口上。同时它也对相关的接口做了控制,比如为了防止访问内存越界,没有提供指针的算术运算,更重要的是,它控制了资源对象的生存期管理,比如,只有在引用计数为0时才释放资源对象,这也正是智能指针的重要功能。也就说,shared_ptr对内包含了一个指针类型成员,对外又表现为一个指针类型,而且还对指针成员的行为做出了控制。这不正是代理模式吗?

由此可见,智能指针unique_ptr和shared_ptr的实现正是代理模式的典型应用。当然,如果严格地按照面向对象编程的特征,因为C++中没有“指针”类,指针只是C++固有的基本类型,可能不是标准的代理模式,虽然外在形式上不同,但确实表现出了代理模式的思想和意图:提供了与裸指针相同的功能,并把请求转发给裸指针处理,同时对裸指针的操作进行了控制(如不提供某种操作,或者限制使用),最核心的控制是能够对裸指针指向的资源对象进行了生存期管理。

此外,C++中还有另一种形式的“类指针”对象:迭代器,它也实现了*、->等操作符函数,而且还提供了++、–、+=、-=等算术操作符,对照代理模式来分析,它也是使用代理模式来实现的(注:它是标准的迭代器模式,这里关注的是它的“类指针”特性)。不过,智能指针作为指针的代理对象,控制的是被代理对象——指针的生存期管理,而迭代器作为“集合指针”(如指向数组的指针)的代理对象,控制的是对所代理的集合指针的遍历访问行为,可以不用关心底层的数据存储方式,同时控制访问时不会越界,显然它的核心功能是指针的算术操作,因为容器里存放的都是对象集合,不止一个,为迭代器提供指针的算术运算操作再正常不过了。

总之,尽管指针在编程使用时,容易发生内存泄漏、指针越界、野指针、重复释放等错误。但是通过它的代理对象-智能指针,可以很好的控制指针的行为,尽可能的避免了一些错误的发生。

如果说智能指针使用工厂模式控制了资源对象的创建过程,那它使用代理模式控制了资源对象的销毁过程:可以控制它在智能对象失去生存期时也立即销毁资源对象,如unique_ptr,也可以控制它在最后一个引用它的智能指针对象失去生存期时再销毁,如shared_ptr。

智能指针又是怎样释放资源对象的呢?下一篇文章介绍所使用的另一种设计模式。

http://www.dtcms.com/wzjs/249657.html

相关文章:

  • 中山外贸出口网站建设多少钱哪里有苹果cms永久免费全能建站程序
  • 用ps做网站设计广州网站seo地址
  • 免费商会网站模板全国互联网营销大赛官网
  • wap商城网站模板素材求好用的seo软件
  • 服务平台网站设计net的网站建设
  • 做企业网站要大陆营业执照seo怎么学
  • 网站设计与建设的电商网站seo优化
  • 网站开发违约属于什么纠纷百度关键词规划师
  • 建筑网片排焊机西安优化seo
  • 沧州企业做网站怎么在网上做广告宣传
  • 杭州湾新区建设委员会网站企业培训课程价格
  • 保山网站建设排名前50名免费的网站
  • 浙江网站建设模板网站学做网站培训班要多少钱
  • 精彩的网格布局网站百度免费seo
  • 济南哪家做网站河南网站优化公司哪家好
  • 新乡商城网站建设哪家好app拉新推广怎么做
  • wordpress disable_functionsseo网站权重
  • 网站建设快速杭州百度推广开户
  • 网站建设市场分析2015网络推广代理
  • 重庆做模块网站长春网站快速排名提升
  • 陕西省建设执业资格注册中心网站百度广告平台
  • 沈阳企业网站信息服务平台有哪些
  • 河津做网站东莞推广
  • 江门建设银行网站徐州百度推广
  • 河北盘古做的网站用的什么服务器运营商推广5g技术
  • 影视广告设计与制作网站seo主要是做什么的
  • 策划书案例范文seo网站的优化流程
  • 为什么一个网站做中英文双语版seo软文是什么意思
  • 美食网站中饮食资讯该怎么做如何提高网站在搜索引擎中的排名
  • 成都专业做网站公司佛山网站建设正规公司