1. 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 2. 动机 对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机( printer spooler),只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个 A / D转换器。一个会计系统只能专用于一个公司。 我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,inng kk。 一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。 3. 适用性 在下面的情况下可以使用 S i n g l e t o n模式 - 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 - 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 4. 结构 5. 参与者 定义一个 I n s t a n c 继续阅读 >>


楚东方 17/07/31 08:59:39
通常,I/O复用机制都需要事件分享器。分享器对象可将来自事件源的I/O事件分离出来,并分发到对应的Read/Write事件处理器。开发人员预先注册需要处理的事件及该事件对应的事件处理器。 Reactor和Proactor都涉及到了事件分享器,不同的是,Reactor是基于同步I/O的,而Proactor是与异步I/O相关。 在Reactor模式中,事件分离器等待某个事件或者某个操作的状态发生,比如文件描述符可读写或是socket可读写,事件分离器就将这个时间传给事先注册的事件处理器(事件处理函数或者回调函数),由后者来做实际的读写操作。 而在Proactor模式中,事件处理器直接发起一个异步读写操作,发起时,需要提供用于存放读到数据的缓存区、读的数据大小。以及这个请求完成后的回调函数等信息。事件分离器收到请求后,默默等待这个请求的完成,然后转发完成事件给对应的事件处理器。这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可以称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写操作是由操作系统来代劳的。 我们用读操作来举例,更好的理解 继续阅读 >>


师毅 17/03/01 18:40:34
一:工厂模式 将实例化具体类的过程交给工厂,你只用告诉它你需要什么样的类型就好了。 比如下面这段代码: Fruit createFruit(string name) { Fruit fruit; -------------------------------- if(name == "Apple") { fruit = new Apple(); } else if(name == "Banana") { fruit = new Banana(); } else if(name == "peach") { fruit = peach(); } --------------------------------- fruit.cut(); //将水果切块 fruit.box(); //将水果装盒 return fruit; } 如果我将上面代码片段中两条横线之间的代码实现为另一个方法叫Fru 继续阅读 >>


杨博东 16/12/06 20:43:55
一:装饰者模式 将最初的对象用一层一层外衣(修饰者)包装起来,实现自由组合。 举个栗子: 最初的对象:咖啡 外衣:糖,牛奶,豆浆… 我可以将上面的类型自由组合,比如 咖啡加糖和牛奶 或者 咖啡加豆浆 或者 咖啡加糖和豆浆 或者 ...。 二:不使用装饰者模式 实现上面的栗子,如果没有使用装饰者模式,类图可能是这样: 缺点非常明显: 有多少种组合就必须自己实现多少个子类 设计子类时必须严格考虑,比如没有人在咖啡中加牛奶又加豆浆 子类的cost()方法实现具体价格的计算,那要是牛奶价格上升,调整与牛奶相关的每一个子类中的cost()方法将会使你奔溃。 三:使用装饰者模式 基本原则是我们定义一种公共类型A,每个A中有相同的方法,参数都是同一种类型A,这样我们可以一层一层在原始咖啡上加东西。假设像下面这样调用我就能返回相应的价格。 CoffeeWithMilk = new Milk(new Coffee()); //CoffeeWithMilk.cost() 就能返回`咖啡加牛奶`价格 再来个稍微复杂的 CoffeeW 继续阅读 >>


杨博东 16/12/01 11:34:31
一:装饰者模式 将最初的对象用一层一层外衣(修饰者)包装起来,实现自由组合。 举个栗子: 最初的对象:咖啡 外衣:糖,牛奶,豆浆… 我可以将上面的类型自由组合,比如 咖啡加糖和牛奶 或者 咖啡加豆浆 或者 咖啡加糖和豆浆 或者 ...。 二:不使用装饰者模式 实现上面的栗子,如果没有使用装饰者模式,类图可能是这样: 缺点非常明显: 有多少种组合就必须自己实现多少个子类 设计子类时必须严格考虑,比如没有人在咖啡中加牛奶又加豆浆 子类的cost()方法实现具体价格的计算,那要是牛奶价格上升,调整与牛奶相关的每一个子类中的cost()方法将会使你奔溃。 三:使用装饰者模式 基本原则是我们定义一种公共类型A,每个A中有相同的方法,参数都是同一种类型A,这样我们可以一层一层在原始咖啡上加东西。假设像下面这样调用我就能返回相应的价格。 CoffeeWithMilk = new Milk(new Coffee()); //CoffeeWithMilk.cost() 就能返回`咖啡加牛奶`价格 再来个稍微复杂的 CoffeeW 继续阅读 >>


杨博东 16/12/01 11:33:09
一:观察者模式 定义一对多(1:n)的对象关系,如果1发生变化,那么n都会收到通知,这叫观察者模式。当然,我觉得叫”出版者——订阅者”模式更加容易理解。就像你在报社订了报纸,只要报社有新报纸出版,送报员就会给你家送一份,如果不想要,还可以退定。 二:来个栗子 举一个Head First书上的栗子: 首先这是一个气象局的显示系统,WeatherData是数据的来源,Subject是一个公共基础主题,Observer是观察者的父类。WeatherData的数据如果更新,我希望forecastObserver这个面板上的数据也更新,为了使结构简单,我没有添加xObserver和yObserver等其他的Observer,但是并不代表它们不存在(实际上是可以任意扩展的)。 当然,在系统中,WeatherData也只是数据变化的一部分,如果有两部分或者更多,我们可以继续有OtherData...,让它继承自Subject就好了。Subject中定义的方法addObserver可以被forecastObserver显式的调用将自己添加到WeatherData 继续阅读 >>


杨博东 16/11/30 16:28:43
我慢慢的开始对于一些概念给出我自己的定义,而不是去搬一些“标准”或“书”,因为一个是当我发现我之前写的博客凡是“抄”过书上的到现在我仍然需要查之外,还有一个原因是我也慢慢开始找到自己学习的方法。所以如果我的定义和概念和标准不一样,请您批判着看。另外需要注意评论,我后面很可能补充一些东西或者纠正一些东西。 一:策略模式 对于同一个功能的不同实现(比如鸭子的“叫声”有“呱呱叫”还有“嘎嘎叫”),将他们分别用不同的类实现。 二: 什么意思? 举个栗子,我们想做一个“鸭子”的系统,用来表示世界上所有的鸭子,鸭子基本上都会游泳;鸭子有的会飞,有的不会飞;有的嘎嘎叫,有的呱呱叫;有的羽毛是白色,有的羽毛是黑色…… 如果你能想到可以定义一个鸭子的父类,将公共属性集合到一起,那么很好,你已经有面向对象的基本思想了,我们可以这么干: abstract class Duck { swim(); { //实现 }; //游泳 abstract quack(); //叫的方法不一样,让鸭子各自实现 abstract 继续阅读 >>


杨博东 16/11/29 19:05:24
前言  单例模式,故名思义,其意图是保证一个类只有一个实例,并提供一个访问它的全局访问点,该实例被所有的程序模块共享.在很多地方要用到这种设计模式,如系统的日志输出,操作系统的窗口,一个pc连一个键盘等. 单例模式有许多实现方法. 1.懒汉模式   第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例, 需要加锁,因为可能会有多个线程进入判断实例是否存在的if语句,从而它是非线程安全的.使用double-check(即两次判断实例是否存在,原因见代码注释.),同时,如果处理大量数据,该锁成为严重的性能瓶颈. #include<iostream> #include<mutex> class Singleton { private: Singleton(){}; // Singleton(const Singleton &);  // Singleton& operator = (const Singleton &); public: static Sin 继续阅读 >>


杨龙飞 16/09/27 21:02:55
动态代理(Dynamic Proxy) 静态代理的缺点: 静态代理 是有缺点的,看下图。 我们为每个类实现代理,但代理的内容却可能是相同的,比如一个项目中的日志代理,对象缓存代理等等。为每个类实现代理大大提高了代码量,可能会变得难以控制。 动态代理: 用一句话来简单概述:动态代理按功能固定代理类,动态的更换 代理类中的被代理对象。 静态代理不固定代理类,为每个被代理对象创建代理类。 动态代理类固定了代理类,通过反射来动态的为每个对象代理。 例子: 给两个对象增加日志功能 package Reflect; import java.lang.reflect.*; /** * Created by andy.wwh on 2016/6/20. */ /* * 对象 1 * */ interface Subject { public String say(String name, int age); } class RealSubject implements Subjec 继续阅读 >>


王伟豪 16/06/21 10:30:22
代理模式(Proxy Pattern) 概念: 定义:代理模式 为另一个对象提供一个替身或占位符以控制这个对象的访问。 代理模式很好理解,在生活中也很常见。举个简单的例子,我们自己能做很多事情(动作),比如写作业,出去玩等。当我们和父母在家的时候,同学叫我们出去玩,父母先收到消息,然后忽略掉出去玩的信息。如果同学叫我们去写作业,父母接收到后在传达给我们。此时父母就是我们的代理,并且对我们 资源 进行了一定的控制,这是代理模式的一种:保护代理。 使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是 远程的对象、创建开销大的对象 或 需要安全控制 的对象。 常见的代理模式有 3 种: 远程代理:控制访问远程对象。 虚拟代理:控制访问创建开销大的资源。 保护代理:基于权限控制对资源的访问。 组成: Subject(接口):Proxy 和 RealSubject 对象都实现 Subject 接口,这使得任何客户端都可以像处理 Proxy 一样处理 RealSubject。 Proxy(代理对象):代 继续阅读 >>


王伟豪 16/06/02 10:11:26