随笔分类 -  设计模式系列

摘要:概要本来不准备写Status模式,因为它跟Strategy模式简直就是对孪生兄弟,类结构类似,处理方式类似,相像的几乎没有多少好说的,后来权衡了下,毕竟这也是GOF单独提出来的一种模式,而且Status模式跟Stragegy模式的关注点多少还是有些不同的。那么Status模式到底能做什么,怎么做的呢?程序中经常会涉及到各种状态,每种状态下会有不同的处理逻辑,状态之间能进行切换,切换状态的同时也需要改变它们的行为,这种情况下我们的程序很容易陷入各种耦合的泥潭,Status模式可以帮助我们解决这类问题,使程序易于扩展,调理清晰。其实Strategy模式封装的是算法间的切换,而Status模式做的则 阅读全文
posted @ 2012-07-05 10:14 MXi4oyu 阅读(324) 评论(0) 推荐(0)
摘要:概要基于OO来设计经常会产生很多对象,而这些对象之间又会相互交互影响,所以经常会导致对象间的紧耦合,为了能够避免这种紧耦合,就需要一种机制让每个对象能够很方便的跟其他对象交互而又不需要跟这些对象交叉耦合在一起。怎么做?有人会说Observer模式不就是解决这类问题的吗?确实,一点没错,Observer模式关注的是被观察主题Subject和观察者Observer之间的交互。而本文将介绍的Mediator模式也是为了解决这类问题,但关注点跟Observer有所不同,我们来看看它是怎么做的。目的定义一个对象来封装其他一组对象间的交互行为,减少其他对象间的耦合度,让这些对象间的交互可以更独立地被修改。 阅读全文
posted @ 2012-07-04 14:06 MXi4oyu 阅读(404) 评论(0) 推荐(0)
摘要:概要当要为某个类扩展功能时,怎么做?太简单了,想扩展什么功能就加什么样的方法就得了呗!那如果这个类属于某个你不能轻易修改的Lib时,又怎么做呢?还是很简单,OO有很多用于扩展的概念和模式,最原始的如继承、组合也是一种扩展。确实如此,而今天,让我们再来讨论提供一种很灵活扩展方式的----Visitor模式。目的为某些类提供新的功能和方法,而不需要修改这些类。实例假设我们有很多设备,比如移动电话,PC,Pad等,这些设备有提供了一些功能,比如开机,关机,连网,断网等,用类图和简单的代码来描述,如下所示:class Device { public: virtual void PowerOn... 阅读全文
posted @ 2012-06-14 16:39 MXi4oyu 阅读(223) 评论(0) 推荐(0)
摘要:概要Template Method模式,这里的Template跟C++或java的模板是两回事,只是表达含义的模式名而已。从名字来理解,Template Method模式就是一种把处理模板化的模式。详细来说,Template Method模式会把一些比较稳定的算法封装到抽象层的基类方法中,在Template Method中通过多态去调用一些子类的具体实现。目的在基类中定义算法框架的方法,通过该方法去调用子类中封装的算法各个步骤的具体实现。实例设计一个绘图程序,会根据实际情况使用多个第三方库绘制直线的方法,在我们的程序中要实现矩形绘制的方法。分析一下这个绘图程序的需求,首先会有多个库提供绘制直线 阅读全文
posted @ 2012-05-24 16:38 MXi4oyu 阅读(236) 评论(0) 推荐(0)
摘要:概要系统中会包含很多行为,有些行为总是存在并需要被执行,而有些行为在某些场合或某种设置下就不希望被执行,通常很多人会通过一些条件对系统行为进行限制来达到目的,但是这样会给本来很简单纯粹的处理增加额外的逻辑,而通过NULL Object模式会提供一个具有代理式的空白行为的对象来解决问题。目的通过NULL Object模式提供一个具有代理式的空白行为的对象,从而隐藏一些判断逻辑。实例看这样一个例子,系统中有类Action,一些具体行为都从类Action继承来扩展,类Manager会使用Action类型的对象来处理相应的动作。类图和代码如下:class Action { public: v... 阅读全文
posted @ 2012-05-24 13:38 MXi4oyu 阅读(231) 评论(0) 推荐(0)
摘要:概要Observer模式算是一种大名鼎鼎的设计模式了,如果你还没听说过Observer模式,那你总多少听说过MVC模式吧?其实MVC就是基于Observer模式的细化和扩展。所以如果要理解MVC,就应该首先掌握Observer模式。Observer模式反映的是一种面向对象的一对多的事件触发关系,当某个对象希望在发生某种变化时能通知其他多个对象,而这个对象又不希望跟他希望通知的其他对象产生耦合时,Observer模式会是一种很好的解决方法。目的在对象间建立一对多的对应关系,当发生某种变化时可以通知已建立关系的多个对象。而对象间本身不产生任何耦合。实例Observer模式的例子其实有很多,所有涉及 阅读全文
posted @ 2012-05-23 21:59 MXi4oyu 阅读(211) 评论(0) 推荐(0)
摘要:概要开发中,经常会碰到一些基本逻辑相同,个别算法或处理行为不同的情况,这时如果把所有处理都耦合在一起,会增加模块的复杂度,同时给扩展带来一定难度。一种比较好的方法就是使用Strategy模式来对处理进行解耦,提高扩展性。同时Strategy模式还可以更好的支持"运行时"行为或算法的切换。目的对类行为进行解耦,使算法可以相对独立的变化而不至于对Client产生过多的影响。(每次写概要和目的都比较痛苦,因为这些内容相对比较抽象,自己的文字功底不够,有时要把自己的想法用抽象的文字真正说明清楚还是挺累的)实例看这样一个例子吧。设计一个绘图程序,会用到多个第三方绘图方法,首先我们需要 阅读全文
posted @ 2012-05-14 22:39 MXi4oyu 阅读(218) 评论(0) 推荐(0)
摘要:概要有时候可能我们不希望暴露现有对象的所有接口,只希望公开其中部分接口,具体来说,比如我们有个对象具有一系列的方法接口,如果我们只需要这些接口中间的一小部分,那么我们没必要去创建这个对象本身,我们可以通过一个更轻量的对象作为代理来公开我们需要的那部分接口。目的基于需求提供代理对象来实现既有对象接口,可以通过这种模式来调整现有接口的封装。实例如概要里面所述的通过代理来暴露部分接口的应用比较简单易懂,这里就不举相关实例来进行说明了。这里举个更典型的Proxy模式的应用方式。很多应用中经常需要加载图片,视屏等大容量媒体对象,一些第三方库会提供相应的接口,以图片为例,大致接口如下:class IIma 阅读全文
posted @ 2012-04-17 10:35 MXi4oyu 阅读(201) 评论(0) 推荐(0)
摘要:概要系统中有时我们会创建大量对象,而这些对象间又存在部分相同的特性,完全独立去创建这些对象会消耗大量内存,对象间也存在重复冗余的部分。所以,可以考虑把对象间那部分相同的内容通过共享元来进行共享,节省内存,避免冗余。目的提取大量对象中相同的特性,通过共享对象来封装,节省对象存储空间,提高效率。应用老规矩,从实例中看真相吧。比如说我们有个地图的应用,地图上有各种标识用来显示具体位置,比如有酒店标识,银行标识,超市标识这三种标识,就以酒店标识为例:class HotelMark { public: HotelMark() { mImage = new HotelImag... 阅读全文
posted @ 2012-04-13 22:46 MXi4oyu 阅读(153) 评论(0) 推荐(0)
摘要:概要又是一种比较常见也比较常用的模式。系统模块经常需要进行功能上的扩展,比如下面这种形式的结构,当需要扩展新Function时,通常会通过继承追加新类来实现功能的扩展。但是如果我们不是扩展一个新功能的对象,而只是对所有现有的每种功能类的处理进行扩展时,我们应该怎么做?Decorator模式可以很好的解决这类问题。目的为一系列对象动态追加(或删除)额外的功能,并保证统一的外部接口实例考虑这样一个比较典型的例子吧。UI中会用到很多种的window,比如对话框,菜单,tab窗口,树状窗口等。class BaseWin { public: virtual void Show(); }; cl... 阅读全文
posted @ 2012-04-11 16:57 MXi4oyu 阅读(148) 评论(0) 推荐(0)
摘要:概要具备一系列既有独立功能,又需要排列组合其中的几种功能来达成一些复合的新功能时,可以采用组合模式。比如说,你设计了一个备份模块,有email备份,note备份,message备份,log备份等一系列备份功能,而你又会需要同时备份它们中间不定的几种时,考虑用组合模式吧。它能组合对象处理,而又不增加额外的耦合,并保证接口一致,以及模块的易用性和扩展性。目的自由组合既有对象处理来实现复合对象,保证单一对象和复合对象具有统一的对外接口。实例Command模式应该都比较熟悉了,这里结合Command模式来举个例子。有时我们会把行为(action)封装为类,比如我们需要如下这些action,保存acti 阅读全文
posted @ 2012-04-10 17:42 MXi4oyu 阅读(189) 评论(0) 推荐(0)
摘要:概要什么是所谓的替换原则?开发中我们通常会通过继承实现一些子类来达到功能的扩展,比如假设我们有基类B,有个B类型的指针或引用作为某个函数的参数,这时我们创建了子类C继承于B,如果当把指向C类对象的指针作为参数传递时,出现了一些意料之外的异常时,它就违反了LSP。说的有点抽象,到实例再具体说明。目的子类类型完全能替换基类类型而不会发生异常实例与效果举个LSP经典的例子来说明下吧。比如我们有个Rectangle,可以设定长和宽,同时可以计算它的面积,我们还有正方形的需求,所以我们创建一个Square类,继承于Rectangle。具体实现如下:class Rectangle { public: .. 阅读全文
posted @ 2012-03-31 16:53 MXi4oyu 阅读(237) 评论(0) 推荐(0)
摘要:概要何谓开放关闭,其实就是对扩展是开放的,对修改是关闭的。前半句好理解,后半句什么意思?进一步说明,就是扩展的同时对固有既定模块是不需要再修改的,如果还要问什么是固有既定模块,抱歉,文字还真不好解释,到后面穿插实例再来说明吧。目的对扩展开发,对修改关闭实例与效果先看个例子,比如我们需要一个封装访问MySql数据库的类。定义一些数据库操作API供外部调用,代码和类图如下所示:class Database { public: void connect(); void execute(); void commit(); void rollback(); };然后你兴致勃勃地开... 阅读全文
posted @ 2012-03-31 08:41 MXi4oyu 阅读(234) 评论(0) 推荐(0)
摘要:概要所谓单一职责,一个类或接口应该只负责一种职责,当某个类或接口会因为两种职责的变更而引起变化时,我们就需要分割职责。目的一个类或接口应该只会因一种职责而发生改变实例与效果先看个例子吧。假设我们需要一个消息的接口类,可以设定发信者和消息内容,很容易我们会设计成这样一个接口以及实现的类,class IMessage { public: virtual void SetSenderType(string sender) = 0; virtual void SetMsgContent(string msg) = 0; }; class Message :public IMessa... 阅读全文
posted @ 2012-03-30 16:01 MXi4oyu 阅读(227) 评论(0) 推荐(0)
摘要:关于出发点从开始接触设计模式到现在也有4年多了,大小著作,文章也翻了很多,心得体会的记录却半点没留下。说到心得,不是吹,还真有些,脑袋里实在憋多了难受,忍不住拿出来晒晒吧。当然,这个方向可参考资料也确实太多了,我这点花花肠子也翻不出啥新花样了,所以大家大可不必当学习资料来看,相反,以评判,讨论的心态来看更合适些。另外,近期也确实想不到有什么其他可写的,这个系列应该可以用来打发下时间。关于内容既然是设计模式,n种设计模式肯定是会写的,而且不会光局限于GOF(四人帮)书里面的那23种。至于哪种先写哪种后写,还没决定,哪个先从我脑子里溢出的就先写哪个吧。另外,几种面向对象设计原则(oo princi 阅读全文
posted @ 2012-03-30 15:58 MXi4oyu 阅读(152) 评论(0) 推荐(0)