设计模式攻略
畅谈设计模式,这里有属于你我的一份精彩。
MU_SZ
平凡的IT人,平淡的IT生活,希望这里的点滴,能成为其中不多的亮点
展开
-
【设计模式攻略】创建型模式之Abstract Factory模式
概要Abstract factory模式其实就是普通factory模式的一种进化,它比较侧重于对一个系列中相关多个对象的创建工作。何谓一个系列?其实就是某种客观条件下满足特定需求的一组对象集合。当面对多个系列时,需要实现每个系列的实例化的Factory,这时使用一般的Factory模式往往让过程变得复杂,而Abstract factory模式则可以解决这类问题。目的Abst原创 2014-02-24 14:05:16 · 2734 阅读 · 0 评论 -
【设计模式攻略】创建型模式之Factory method模式
概要之前讨论过行为型模式之一的Template method模式,而Factory method模式其实是Template method模式在Factory场景(创建对象)下的一种应用形式。对Template method模式的定义是在基类中为算法框架定义方法,通过该方法去调用子类中封装的算法各个步骤的具体实现,那么Factory method模式呢?其实就是一种具体的应用,我对它的定义是原创 2014-02-10 14:52:30 · 2464 阅读 · 0 评论 -
【设计模式攻略】创建型模式之Factory模式
概要Factory模式在现代编程语言中应该也是使用最广泛的模式之一。Factory模式有很多变体,根据实际情况,实现形式多样。最常见的可能还是GOF中提出的Abstract Factory模式和Factory Method模式。本文只是从最基本的Facotry模式概念本身出发,看看抛开GOF提出的两种经典Factory模式不谈,现阶段常见Factory模式的实现形式,在后续的其他文章中会再跟大原创 2014-02-08 16:18:58 · 3115 阅读 · 0 评论 -
【设计模式攻略】创建型模式之Singleton模式(也谈勿滥用Singleton)
概要如果要说GOF提出的设计模式中最简单以及用的最多的模式是哪种,无疑应该是Singleton模式。它的实现仅仅涉及一个Class,由这个类来负责其本身的实例化,而这个实例化满足唯一性的要求就可以,就这么简单。但是,正因为其简单,简单到随手可用,导致Singleton模式又是目前最容易被滥用的一种模式。后文会讨论滥用Singleton会带来什么问题。目的确保仅仅会实例化一个唯一原创 2014-02-07 10:12:35 · 4026 阅读 · 0 评论 -
【设计模式攻略】结构型模式之Facade模式
概要Facade模式所涵盖的范围虽然可大可小,但更多的还是被当作一种架构型的模式来考虑,所以它更多的说明的是一种思想,而不是一种实现方式。每个系统内都会涉及多个模块,每个模块又会涉及多个类,每个类会有多种属性或方法,它们之间往往会有各种错综复杂的关系,理清这种关系,设计出能让别人也清楚的架构方案,是一个系统架构者的主要任务之一。而Facade模式就是一种帮助优化模块或类间复杂关系的一种思想。那原创 2013-10-25 15:13:00 · 3386 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Chain of Responsibility模式
概要程序中经常出现这样的逻辑,收到XX请求,进行XX相关的响应处理,收到YY请求,则进行YY的响应处理。请求与响应之间彼此配对,所以代码也往往会为这种配对提供一对一的对应关系。比如说之前说过的Command模式中,一种Command会跟一个Performer对应起来确保这种逻辑关系。那如果某个请求该如何响应是未知或动态决定的,如何处理呢?答案之一,用一堆条件来判断限制啊?很多情况下,没错,应该原创 2013-10-25 13:58:16 · 2411 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Command模式
概要一种行为触发另一种行为,这是程序控制中最基本的逻辑。触发的形式,可以有很多种,比如我们经常通过一系列命令或指令来区分不同的触发行为,而在实现的过程中,很多人容易犯这样一个错误,就是把触发方与执行方强耦合在一起,当处理逻辑简单,命令种类不多时,倒并不会有太多问题,但是当程序构架复杂,处理流多样化时,往往会带来诸多不便,甚至引起灾难性的后果。本文想介绍的Command模式,就是一种处理命令原创 2013-10-23 10:37:05 · 2373 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Iterator模式
概要程序中最常见的一种数据形式之一,就是集合。集合就是vector,list,set,map等容器的统称。,既然使用容器都有一个常规的问题,容器内数据的访问,包括查询,遍历等等操作。而要实现这些操作,普遍的做法就是通过迭代器来实现。很多人在封装自定义的某种集合的数据类型时,往往会在集合类型中额外增加遍历,查询的接口,但这种做法其实并不属于迭代器的范畴。常规的迭代器应该具备如下特点:1. 通原创 2013-10-10 08:50:31 · 2625 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Status模式
概要本来不准备写Status模式,因为它跟Strategy模式简直就是对孪生兄弟,类结构类似,处理方式类似,相像的几乎没有多少好说的,后来权衡了下,毕竟这也是GOF单独提出来的一种模式,而且Status模式跟Stragegy模式的关注点多少还是有些不同的。那么Status模式到底能做什么,怎么做的呢?程序中经常会涉及到各种状态,每种状态下会有不同的处理逻辑,状态之间能进行切换,切换状态的同原创 2012-07-05 10:14:16 · 2024 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Mediator模式
概要基于OO来设计经常会产生很多对象,而这些对象之间又会相互交互影响,所以经常会导致对象间的紧耦合,为了能够避免这种紧耦合,就需要一种机制让每个对象能够很方便的跟其他对象交互而又不需要跟这些对象交叉耦合在一起。怎么做?有人会说Observer模式不就是解决这类问题的吗?确实,一点没错,Observer模式关注的是被观察主题Subject和观察者Observer之间的交互。而本文将介绍的Medi原创 2012-07-04 14:06:04 · 1551 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Visitor模式
概要当要为某个类扩展功能时,怎么做?太简单了,想扩展什么功能就加什么样的方法就得了呗!那如果这个类属于某个你不能轻易修改的Lib时,又怎么做呢?还是很简单,OO有很多用于扩展的概念和模式,最原始的如继承、组合也是一种扩展。确实如此,而今天,让我们再来讨论提供一种很灵活扩展方式的----Visitor模式。目的为某些类提供新的功能和方法,而不需要修改这些类。实例假原创 2012-06-14 16:39:54 · 1854 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Template Method模式
概要Template Method模式,这里的Template跟C++或java的模板是两回事,只是表达含义的模式名而已。从名字来理解,Template Method模式就是一种把处理模板化的模式。详细来说,Template Method模式会把一些比较稳定的算法封装到抽象层的基类方法中,在Template Method中通过多态去调用一些子类的具体实现。目的在基类中定义算法框原创 2012-05-24 16:38:53 · 1414 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Null Object模式
概要系统中会包含很多行为,有些行为总是存在并需要被执行,而有些行为在某些场合或某种设置下就不希望被执行,通常很多人会通过一些条件对系统行为进行限制来达到目的,但是这样会给本来很简单纯粹的处理增加额外的逻辑,而通过NULL Object模式会提供一个具有代理式的空白行为的对象来解决问题。目的通过NULL Object模式提供一个具有代理式的空白行为的对象,从而隐藏一些判断逻辑。原创 2012-05-24 13:38:31 · 2047 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Observer模式
概要Observer模式算是一种大名鼎鼎的设计模式了,如果你还没听说过Observer模式,那你总多少听说过MVC模式吧?其实MVC就是基于Observer模式的细化和扩展。所以如果要理解MVC,就应该首先掌握Observer模式。Observer模式反映的是一种面向对象的一对多的事件触发关系,当某个对象希望在发生某种变化时能通知其他多个对象,而这个对象又不希望跟他希望通知的其他对象产生耦合时原创 2012-05-23 21:59:19 · 1615 阅读 · 0 评论 -
【设计模式攻略】行为型模式之Strategy模式
概要开发中,经常会碰到一些基本逻辑相同,个别算法或处理行为不同的情况,这时如果把所有处理都耦合在一起,会增加模块的复杂度,同时给扩展带来一定难度。一种比较好的方法就是使用Strategy模式来对处理进行解耦,提高扩展性。同时Strategy模式还可以更好的支持"运行时"行为或算法的切换。目的对类行为进行解耦,使算法可以相对独立的变化而不至于对Client产生过多的影响。(每原创 2012-05-14 22:39:07 · 2222 阅读 · 0 评论 -
【设计模式攻略】结构型模式之Proxy模式
概要有时候可能我们不希望暴露现有对象的所有接口,只希望公开其中部分接口,具体来说,比如我们有个对象具有一系列的方法接口,如果我们只需要这些接口中间的一小部分,那么我们没必要去创建这个对象本身,我们可以通过一个更轻量的对象作为代理来公开我们需要的那部分接口。目的基于需求提供代理对象来实现既有对象接口,可以通过这种模式来调整现有接口的封装。实例如概要里面所述的通过代原创 2012-04-17 10:35:05 · 1377 阅读 · 0 评论 -
【设计模式攻略】结构型模式之Flyweight 模式
概要系统中有时我们会创建大量对象,而这些对象间又存在部分相同的特性,完全独立去创建这些对象会消耗大量内存,对象间也存在重复冗余的部分。所以,可以考虑把对象间那部分相同的内容通过共享元来进行共享,节省内存,避免冗余。目的提取大量对象中相同的特性,通过共享对象来封装,节省对象存储空间,提高效率。应用老规矩,从实例中看真相吧。比如说我们有个地图的应用,地图上有各种原创 2012-04-13 22:46:06 · 1186 阅读 · 0 评论 -
【设计模式攻略】结构型模式之Decorator模式
概要又是一种比较常见也比较常用的模式。系统模块经常需要进行功能上的扩展,比如下面这种形式的结构,当需要扩展新Function时,通常会通过继承追加新类来实现功能的扩展。但是如果我们不是扩展一个新功能的对象,而只是对所有现有的每种功能类的处理进行扩展时,我们应该怎么做?Decorator模式可以很好的解决这类问题。目的为一系列对象动态追加(或删除)额外的功能,并保原创 2012-04-11 16:57:04 · 1481 阅读 · 0 评论 -
【设计模式攻略】结构型模式之Composite模式
概要具备一系列既有独立功能,又需要排列组合其中的几种功能来达成一些复合的新功能时,可以采用组合模式。比如说,你设计了一个备份模块,有email备份,note备份,message备份,log备份等一系列备份功能,而你又会需要同时备份它们中间不定的几种时,考虑用组合模式吧。它能组合对象处理,而又不增加额外的耦合,并保证接口一致,以及模块的易用性和扩展性。目的自由组合既有对象处理来实原创 2012-04-10 17:42:04 · 2392 阅读 · 0 评论 -
【设计模式攻略】结构型模式之Bridge模式
概要先考虑下在通信,电子等很多领域都常用的桥接概念,它的作用是什么?第一,它可以连接两个区域,第二,它可以隔离两个区域,简单来说也就是连接与分离的作用。而这里的 Bridge模式也是类似,它可以分离系统的不同层次,使不同层次的实现可以相互独立的变化,同时它又为不同层次间建立起了连接进行交互。目的对 Bridge模式,比较教条或比较官方的定义是,可以分离抽象与实现,并使它们可以相原创 2012-04-05 09:14:03 · 1851 阅读 · 0 评论 -
【设计模式攻略】结构型模式之Adapter模式
概要Adapter模式,中文名为适配器模式,从字面意思来看不难理解,就是通过模块,接口的包装和适配达到模块接口兼容协作的目的。这算是一个很简单的模式,就算你从来没看过设计模式,从未听说过Adapter模式,听我后面的介绍后,也许你会很不屑的说,“早在我之前设计过的N个项目中,用过这种所谓的Adapter模式N×N次了。”下面就让我们来看看这种常见,常用又作用不小的设计模式吧。目的原创 2012-04-03 22:27:23 · 1498 阅读 · 0 评论 -
【设计模式攻略】OO设计原则之ISP-接口隔离原则
概要所谓接口隔离,就是把可以分离的方法分离到不同的接口类中,防止在实际应用中被迫去实现一些本并不需要的接口方法。其实一定程度上跟SRP原则类似。只是ISP更关注与接口实现和使用,而SRP更关注于接口本身。目的接口用户不应该被迫去实现和依赖一些本不会使用的接口方法。实例与效果假设我们需要实现通信的接口,基于通信的一些基本功能,我们可能会设计这样的接口:原创 2012-04-01 16:33:32 · 2245 阅读 · 0 评论 -
【设计模式攻略】OO设计原则之DIP-依赖倒置原则
概要依赖倒置原则,从字面意思看的话,就是反映的是模块间依赖关系的问题。目的降低耦合,降低变更引发的风险,提高扩展性实例与效果先让我们从宏观上来看下,举个例子,我们经常会用到宏观的一种体系结构模式--layer模式,通过层的概念分解和架构系统,比如常见得三层架构等。那么依赖关系应该是自上而下,也就是上层模块依赖于下层模块,而下层模块不依赖于原创 2012-04-01 10:06:32 · 4727 阅读 · 1 评论 -
【设计模式攻略】OO设计原则之LSP-Liskov替换原则
概要什么是所谓的替换原则?开发中我们通常会通过继承实现一些子类来达到功能的扩展,比如假设我们有基类B,有个B类型的指针或引用作为某个函数的参数,这时我们创建了子类C继承于B,如果当把指向C类对象的指针作为参数传递时,出现了一些意料之外的异常时,它就违反了LSP。说的有点抽象,到实例再具体说明。目的子类类型完全能替换基类类型而不会发生异常实例与效果原创 2012-03-31 16:53:16 · 2097 阅读 · 2 评论 -
【设计模式攻略】OO设计原则之OCP-开放-关闭原则
概要何谓开放关闭,其实就是对扩展是开放的,对修改是关闭的。前半句好理解,后半句什么意思?进一步说明,就是扩展的同时对固有既定模块是不需要再修改的,如果还要问什么是固有既定模块,抱歉,文字还真不好解释,到后面穿插实例再来说明吧。目的对扩展开发,对修改关闭实例与效果先看个例子,比如我们需要一个封装访问MySql数据库的类。定义一些数据库操作API供外部调用,原创 2012-03-31 08:41:07 · 3214 阅读 · 0 评论 -
【设计模式攻略】OO设计原则之SRP-单一职责原则
概要所谓单一职责,一个类或接口应该只负责一种职责,当某个类或接口会因为两种职责的变更而引起变化时,我们就需要分割职责。目的一个类或接口应该只会因一种职责而发生改变实例与效果先看个例子吧。假设我们需要一个消息的接口类,可以设定发信者和消息内容,很容易我们会设计成这样一个接口以及实现的类,class IMessage {public:原创 2012-03-30 16:01:21 · 1767 阅读 · 0 评论 -
【设计模式攻略】序
关于出发点从开始接触设计模式到现在也有4年多了,大小著作,文章也翻了很多,心得体会的记录却半点没留下。说到心得,不是吹,还真有些,脑袋里实在憋多了难受,忍不住拿出来晒晒吧。当然,这个方向可参考资料也确实太多了,我这点花花肠子也翻不出啥新花样了,所以大家大可不必当学习资料来看,相反,以评判,讨论的心态来看更合适些。另外,近期也确实想不到有什么其他可写的,这个系列应该可以用来打发下时间。原创 2012-03-30 15:58:04 · 1427 阅读 · 0 评论