23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。

创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。创建型模式有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些具体的类的信息封装起来。第二,它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关于这些对象所知道的是由抽象类所定义的接口。因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的“产品”对象配置一个系统。配置可以是静态的(即在编译时指定),也可以是动态的(在运行时)。

结构型模式涉及到如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。因为可以在运行时刻改变对象组合关系,所以对象组合方式具有更大的灵活性,而这种机制用静态类组合是不可能实现的。

行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。行为类模式使用继承机制在类间分派行为。行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。

创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式);5、Prototype(原型模式).

结构型模式包括:6、Bridge(桥接模式);7、Adapter(适配器模式);8、Decorator(装饰模式);9、Composite(组合模式);10、Flyweight(享元模式);11、Facade(外观模式);12、Proxy(代理模式).

行为模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(状态模式);16、Observer(观察者模式);17、Memento(备忘录模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(访问者模式);21、Chain of Responsibility(责任链模式);22、Iterator(迭代器模式);23、Interpreter(解释器模式).

Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。

Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。

Flyweight:运用共享技术有效地支持大量细粒度的对象。

Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

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

Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

Proxy:(1)、意图: 为其它对象提供一种代理以控制对这个对象的访问。

(2)、适用性:在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。A、远程代理(Remote Proxy):为一个对象在不同的地址空间提供局部代表。B、虚代理(Virtual Proxy):根据需要创建开销很大的对象。C、保护代理(Protection Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。D、智能指针(Smart Reference):取代了简单的指针,它在访问对象时执行一些附加操作。它的典型用途包括:a、对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它。b、当第一次引用一个持久对象时,将它装入内存。c、在访问一个实际对象前,检查是否已经锁定了它,以确保其它对象不能改变它。

(3)、相关模式:A、适配器Adapter为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。B、尽管Decorator的实现部分与代理相似,但decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。代理的实现与Decorator的实现类似,但是在相似的程度上有所差别。Protection Proxy的实现可能与Decorator的实现差不多。另一方面,Remote Proxy不包含对实体的直接引用,而只是一个间接引用。Virtual Proxy开始的时候使用一个间接引用,例如一个文件名,但最终将获取并使用一个直接引用。

远程代理:可以隐藏一个对象在不同地址空间的事实。

虚拟代理:通过代理来存放需要很长时间实例化的对象。

安全代理:用来控制真实对象的访问权限。

智能引用:当调用真实对象时,代理处理另外一些事。

Proxy模式的最大的好处就是实现了逻辑和实现的彻底解耦。

示例代码1:

#include <string>
#include <iostream>using namespace std;//定义接口
class Interface
{
public:virtual void Request() = 0;
};//真实类
class RealClass : public Interface
{
public:virtual void Request(){cout<<"真实的请求"<<endl;}
};//代理类
class ProxyClass : public Interface
{
private:RealClass* m_realClass;
public:virtual void Request(){m_realClass = new RealClass();m_realClass->Request();delete m_realClass;}
};//客户端
int main()
{ProxyClass* test = new ProxyClass();test->Request();/*result真实的请求*/return 0;
}

示例代码2:

Proxy.h:

#ifndef _PROXY_H_
#define _PROXY_H_class Subject
{
public:virtual ~Subject();virtual void Request() = 0;
protected:Subject();
private:
};class ConcreteSubject : public Subject
{
public:ConcreteSubject();~ConcreteSubject();void Request();
protected:
private:
};class Proxy
{
public:Proxy();Proxy(Subject* sub);~Proxy();void Request();
protected:
private:Subject* _sub;
};#endif//~_PROXY_H_

Proxy.cpp:

#include "Proxy.h"
#include <iostream>using namespace std;Subject::Subject()
{}Subject::~Subject()
{}ConcreteSubject::ConcreteSubject()
{}ConcreteSubject::~ConcreteSubject()
{}void ConcreteSubject::Request()
{cout<<"ConcreteSubject ... request ..."<<endl;
}Proxy::Proxy()
{}Proxy::Proxy(Subject* sub)
{_sub = sub;
}Proxy::~Proxy()
{delete _sub;
}void Proxy::Request()
{cout<<"Proxy request ..."<<endl;_sub->Request();
}

main.cpp:

#include "Proxy.h"
#include <iostream>using namespace std;int main()
{Subject* sub = new ConcreteSubject();Proxy* p = new Proxy(sub);p->Request();/*resultProxy request ...ConcreteSubject ... request ...*/return 0;
}

代理模式结构图:

参考文献:

1、《大话设计模式C++》

2、《设计模式精解----GoF23种设计模式解析》

3、《设计模式----可复用面向对象软件的基础》

设计模式之代理模式(Proxy)摘录相关推荐

  1. 三国杀与设计模式之代理模式(Proxy)

    本人原博地址:http://blog.saymagic.cn/blog.php?id=17 三国杀案例:在五人局中,作为反贼的黄月英借黄忠的刀杀作为忠臣的夏侯惇,从这句话中我们可以总结出一个成语对不对 ...

  2. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这 ...

  3. 05、人人都会设计模式:代理模式--Proxy

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/1b3b6b003032 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

  4. Java设计模式之代理模式(Proxy)

    参考http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924 1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的 ...

  5. Java24种设计模式(第二种)--代理模式(Proxy Pattern)

    Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...

  6. 二十三种设计模式(第十二种)-----代理模式(Proxy)

    二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...

  7. 设计模式——代理模式(Proxy Pattern)之为别人做嫁衣

    代理模式Proxy Pattern 代理模式 1.背景 2.定义 3.特征 4.应用场景 5.实验案例 参考 代理模式 1.背景 假如说我现在想租一间房子,虽然我可以自己去找房源,做卫生检测等一系列的 ...

  8. 设计模式-代理模式(Proxy Pattern)

    设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...

  9. js设计模式——代理模式proxy

    什么是代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. (可以想象一下明星与经纪人的关系,明星是请求的本体,经纪人就是代理proxy) 如何实现代理模式 代理对象内部含有对本 ...

最新文章

  1. Google排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
  2. 路过的朋友们,最后一天投票,感谢
  3. 加强IIS安全机制 建立高安全性能Web服务器
  4. numpy中的ogrid
  5. HDU2011 多项式求和
  6. oracle输出异常,表导出出现异常,无法继续。
  7. python访问web网页_python访问web的利器:urllib2
  8. 布谷鸟沙盒分析静态文件_“案例沙盒方法”喜提国际商学院协会(AACSB)2019年启发式创新奖...
  9. 同事更新几个表_无法抵挡的帅气!西铁城潮酷光动能表
  10. 创建单实例WPF应用程序的正确方法是什么?
  11. 苹果Mac备份应用推荐:Get Backup Pro
  12. 动态规划——状态转移方程
  13. 逻辑回归算法梳理(从理论到示例)
  14. 记一次img标签图片不拉伸处理办法
  15. jQuery播放音乐
  16. “知识共享”(CC)与开放教育资源(OER)之间的紧密关系
  17. 如何在javascript中发出http请求?
  18. 硬件基础知识(电阻)
  19. 联邦学习(Federated Learning)详解以及示例代码
  20. 【kali】安装ibus中文输入法

热门文章

  1. OpenCV 2.4.9-2.4.13各个版本附加依赖项Lib文件汇总
  2. LeetCode刷题记录8——605. Can Place Flowers(easy)
  3. OpenCV——膨胀与腐蚀
  4. android组件什么时候加载到r文件,Android自定义加载loading view动画组件
  5. 快速精确的体素GICP三维点云配准算法
  6. 【开源方案共享】ORB-SLAM3开源啦!
  7. CMake结合PCL库学习(2)
  8. C/C++面试题分享
  9. Revit:从入门到精通学习教程
  10. uboot引导kernel - 1 - Flash的分区