文章分类 -  23种设计模式

摘要:一、 门面(Facade)模式 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。 医院的例子 用一个例子进行说明,如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。 首先病人必须先挂号,然后门诊。如果医生要求化... 阅读全文
posted @ 2007-02-07 11:08 大牛博客 阅读(544) 评论(0) 推荐(0) 编辑
摘要:一、 合成(Composite)模式 合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。 从和尚的故事谈起 这是小时候我奶奶讲的故事:从前有个山,山里有个庙,庙里有个老和尚在给小和尚讲故事,讲的什么故事呢?从前有个山,山里有个庙……。奶奶的故事要循环多少次,根据你多长时间睡着而定。... 阅读全文
posted @ 2007-02-07 11:08 大牛博客 阅读(674) 评论(0) 推荐(0) 编辑
摘要:一、 桥梁(Bridge)模式 桥梁模式是一个非常有用的模式,也是比较复杂的一个模式。熟悉这个模式对于理解面向对象的设计原则,包括"开-闭"原则(OCP)以及组合/聚合复用原则(CARP)都很有帮助。理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。 桥梁模式的用意 【GOF95】在提出桥梁模式的时候指出,桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implemen... 阅读全文
posted @ 2007-02-07 11:06 大牛博客 阅读(1017) 评论(0) 推荐(0) 编辑
摘要:一、 单例(Singleton)模式 单例模式的特点: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其它对象提供这一实例。 单例模式应用: 每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。 一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地... 阅读全文
posted @ 2007-02-07 11:06 大牛博客 阅读(450) 评论(0) 推荐(0) 编辑
摘要:一、引子 中介在现实生活中并不陌生,满大街的房屋中介、良莠不齐的出国中介……。它们的存在是因为它们能给我们的生活带来一些便利:租房、买房用不着各个小区里瞎转;出国留学也不用不知所措。 中介者模式在程序设计中也起到了类似的作用。 二、定义与结构 GOF给中介者模式下的定义是:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之... 阅读全文
posted @ 2007-02-07 11:04 大牛博客 阅读(464) 评论(1) 推荐(0) 编辑
摘要:一、 代理(Proxy)模式 代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 二、 代理的种类 如果按照使用目的来划分... 阅读全文
posted @ 2007-02-07 11:03 大牛博客 阅读(419) 评论(0) 推荐(0) 编辑
摘要:一、 职责链(Chain of Responsibility)模式 责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。 从击鼓传花谈起 击鼓传花是一... 阅读全文
posted @ 2007-02-07 11:02 大牛博客 阅读(321) 评论(0) 推荐(0) 编辑
摘要:一、 享元(Flyweight)模式 Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级"。这里使用"享元模式"更能反映模式的用意。 享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。内蕴状态是存储在享元对象内部并且不会随环境改变而改变。因此内蕴状态并可以共享... 阅读全文
posted @ 2007-02-07 11:01 大牛博客 阅读(332) 评论(0) 推荐(0) 编辑
摘要:一、 建造者(Builder)模式 建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。 对象性质的建造 有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。 有些... 阅读全文
posted @ 2007-02-07 11:00 大牛博客 阅读(5380) 评论(0) 推荐(1) 编辑
摘要:一、 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类... 阅读全文
posted @ 2007-02-07 10:59 大牛博客 阅读(482) 评论(0) 推荐(0) 编辑
摘要:一、 抽象工厂(Abstract Factory)模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。 为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图: 图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一... 阅读全文
posted @ 2007-02-07 10:58 大牛博客 阅读(642) 评论(0) 推荐(0) 编辑
摘要:一、 原型(Prototype)模式 原型模式的用意是:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。 从孙大圣的手段谈起 孙悟空在与黄风怪的战斗中,"使一个身外身的手段:把毫毛揪下一把,用口嚼得粉碎,望上一喷,叫声'变',变有百十个行者,都是一样得打扮,各执一根铁棒,把那怪围在空中。"换而言之,孙悟空可以根据自己的形象,复制出很多"身外身"来。... 阅读全文
posted @ 2007-02-07 10:42 大牛博客 阅读(355) 评论(0) 推荐(0) 编辑
摘要:一、引子 俗话说:世上难买后悔药。所以凡事讲究个“三思而后行”,但总常见有人做“痛心疾首”状:当初我要是……。如果真的有《大话西游》中能时光倒流的“月光宝盒”,那这世上也许会少一些伤感与后悔——当然这只能是痴人说梦了。 但是在我们手指下的程序世界里,却有的后悔药买。今天我们要讲的备忘录模式便是程序世界里的“月光宝盒”。 二、定义与结构 备忘录(Memento)模式又称标记(Token)模... 阅读全文
posted @ 2007-02-07 10:41 大牛博客 阅读(331) 评论(0) 推荐(0) 编辑
摘要:一、 模板方法(Template Method)模式 准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模版方法模式的用意。 很多人可能没有想到,模版方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用了这... 阅读全文
posted @ 2007-02-07 10:39 大牛博客 阅读(313) 评论(0) 推荐(0) 编辑
摘要:一、 策略(Strategy)模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车(Shopping Cat)系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的教材类图书实行每本一元的... 阅读全文
posted @ 2007-02-07 10:38 大牛博客 阅读(334) 评论(0) 推荐(0) 编辑
摘要:一、 命令(Command)模式 命令(Command)模式属于对象的行为模式【GOF95】。命令模式又称为行动(Action)模式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不... 阅读全文
posted @ 2007-02-07 10:37 大牛博客 阅读(291) 评论(0) 推荐(0) 编辑
摘要:namespace DesignPattern.Interpreter { public abstract class Expression { public abstract bool Interpret(); } public class Constant : Expression { private bool m_va... 阅读全文
posted @ 2007-02-07 10:36 大牛博客 阅读(270) 评论(0) 推荐(0) 编辑
摘要:一、 装饰(Decorator)模式 装饰(Decorator)模式又名包装(Wrapper)模式[GOF95]。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 引言 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成雀儿时,就可以在天上飞行。而不管悟空怎么变化,在二郎神眼里,他永远是那只猢狲。 装饰模式以对客户透明的方式动... 阅读全文
posted @ 2007-02-07 10:36 大牛博客 阅读(283) 评论(0) 推荐(0) 编辑
摘要:一、 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();while(it.hasNext()){ //using “it.next();”do some businesss logic} 而这就是关于迭代器模式应用很好的例子。 二、 定义与结构 迭代器... 阅读全文
posted @ 2007-02-07 10:35 大牛博客 阅读(313) 评论(0) 推荐(0) 编辑
摘要:一、 访问者(Visitor)模式 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。 问题提出 System.Collection命名空间下提供了大量集合操作对象。但大多数情况下处理的都是同类对象的聚集。换言之,在聚集上采取的操作都是一些针对同类型对象的同类操作。但是如果针对一个保存有不同类型对象的聚集采取某种操作该怎么办... 阅读全文
posted @ 2007-02-07 10:13 大牛博客 阅读(235) 评论(0) 推荐(0) 编辑