设计模式与面向对象
文章平均质量分 82
billdavid
这个作者很懒,什么都没留下…
展开
-
大卫的Design Patterns学习笔记02:Factory
大卫的Design Patterns学习笔记02:Factory 一、概述Factory(工厂)模式用于封装对象的创建过程,将对象的创建独立成单独的程序模块,从而提高整个应用系统的Flexibility。 二、结构主要有以下三种Factory模式:1、Simple Factory模式:专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。原创 2005-07-19 12:46:00 · 2735 阅读 · 1 评论 -
大卫的Design Patterns学习笔记17:Mediator
一、概述Mediator(中介者)模式的名称已经基本能够反映该模式的意图:用一个中介对象来封装一系列的对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。Mediator很象十字路口的红绿灯,每个车辆只需和红绿灯交互,而不是在各车辆之间进行交互。Mediator与Proxy的比较Proxy模式是简化的Mediator模式?个人认为从功能上讲,Me原创 2005-07-28 09:36:00 · 1982 阅读 · 0 评论 -
大卫的Design Patterns学习笔记18:Memento
一、概述Memento(备忘录)模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。二、结构Memento模式的类图结构如下图所示: 图1、Memento模式类图示意Memento模式所涉及的角色有三个,备忘录角色、发起人角色和负责人角色。其中:Memento(备忘录):负责存储原发器对象的内部状态,并可防止原发器以外的其他对象原创 2005-08-03 08:44:00 · 1715 阅读 · 0 评论 -
大卫的Design Patterns学习笔记19:Observer
一、概述Observer(观察者)模式又被称作发布-订阅(Publish-Subscribe)模式,用于定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。二、结构Observer模式的结构如下图所示: 图1、Observer模式类图示意上面的类图中包括如下组成部分:Subject(抽象主题)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每原创 2005-08-03 08:46:00 · 1811 阅读 · 0 评论 -
大卫的Design Patterns学习笔记20:State
一、概述State(状态)模式用于把一个对象的内部状态从对象中分离出来,形成单独的状态对象,所有与该状态相关的行为都放入该状态对象中。一个对象可能处在这样或者那样的状态,并且在不同的状态下会表现出不同的行为,这是很平常的事情,例如,我们制作一个定点报时程序,当时间是0:00-12:00时,问候语是:“Good Morning! 现在是...AM.”;当时间是12:00-18:00时,问候语是:“G原创 2005-08-03 08:49:00 · 1621 阅读 · 0 评论 -
大卫的Design Patterns学习笔记21:Strategy
一、概述Strategy(策略)模式又称Policy模式,用于定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。这里的算法并非狭义的数据结构或算法理论中所讨论的KMP、shell sort等算法,而是指应用程序设计中不同的处理逻辑,前面所说的狭义的算法只是其中的一部分。Strategy模式使得算法与算法的使用者相分离,减少了二者间的耦合度,使得算法可独立于使用它的客户而变化;同时,由于原创 2005-08-03 08:52:00 · 1783 阅读 · 0 评论 -
大卫的Design Patterns学习笔记11:Decorator
一、概述继承是对类进行扩展,以提供更多特性的一种基本方法,但是有时候,简单的继承可能不能满足我们的需求。如我们的系统需要提供多种类型的产品:类型A、类型B、...同时,这些产品需要支持多种特性:特性a、特性b、...以下是两种可能的实现:1、继承,分别实现类型Aa、类型Ab、类型Ba、类型Bb、...这种实现方式在类型的数目和所支持特性的数目众多时会造成“类爆炸”,即会引入太多的类型,并且,这种实原创 2005-07-27 09:05:00 · 2191 阅读 · 0 评论 -
大卫的Design Patterns学习笔记13:Chain of Responsibility
一、概述Chain of Responsibility(职责链,以下简称CoR)模式通过将多个对象串接成一条链(Chain),并沿着这条链传递上层应用传来的请求,直到有一个对象处理它为止,使得多个对象都有机会处理上层应用传来的请求,从而避免请求的发送者和接收者之间的耦合关系。对于Chain中的各个对象,可以采用类似单向链表或双向链表的结构,保存各自后继或者前接元素的引用/指针来实现链接(紧密链接)原创 2005-07-28 08:58:00 · 2200 阅读 · 0 评论 -
大卫的Design Patterns学习笔记14:Command
一、概述Command(命令)模式可用于将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,即允许用户指定对何种对象执行何种操作;或者,对请求排队或记录请求日志,以及支持可撤消的操作。二、结构Command模式的结构如下图所示: 图1、Command模式类图示意上图中包括如下角色:客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。命令(原创 2005-07-28 09:02:00 · 2183 阅读 · 0 评论 -
大卫的Design Patterns学习笔记23:Vistor
大卫的Design Patterns学习笔记23:Vistor 一、概述前面已经讨论过的Adapter模式告诉我们如何应对接口不一致对我们的设计造成的影响,但是,这并不能在如下的Context下发挥多大的作用:一个类系中的多个类要求支持相同的操作,但是这些类提供的接口并不一致。看到这里,你可能会说,我干嘛要用什么Adapter?我才没那么笨呢,我直接修改整个类系的接口方法,原创 2005-08-04 08:39:00 · 2340 阅读 · 0 评论 -
大卫的Design Patterns学习笔记24:后记
虽然学习、研究设计模式已经很久,但一直未敢动笔写下任何关于设计模式的文章,一则是因为DP属于软件设计技术,较其它实用编程技术,更为抽象,需有认真思考、充分实践才能领会;其二,虽然GoF的DP一书已对所列举的23种Pattern作了详细的分析、介绍,但要逐一将体会写下来,仍然是一件十分艰巨的任务。因此,从写第一篇概述到现在历时3月有余(已记不清其间有多少次为了举一个贴切的例子苦恼到深夜;原本计划用1原创 2005-08-04 08:40:00 · 2433 阅读 · 2 评论 -
大卫的Design Patterns学习笔记15:Interpreter
一、概述Interpreter(解释器)模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。在这里使用语言这个词似乎将Interpreter模式的应用范围限制到了一个过于狭小的范围,毕竟,我们不是自然语言或者编程语言设计者,需要注意的是,这里所讨论的语言并非指复杂的自然语言或者编程语言,而是一种语义标记,Interpreter模式负责实现这种标记的定义以及将其原创 2005-07-28 09:05:00 · 1968 阅读 · 0 评论 -
大卫的Design Patterns学习笔记08:Composite
一、概述我们往往总是希望用一致的方式访问不同类型的对象,不论这个对象是同一类系中类型A的对象,还是类型B的对象,OO的多态性为我们提供了这种支持。Composite模式将这种观点更进一步,当一个复杂对象由多个同一类系中的对象组成的时候,我们仍然希望用与访问单个对象一致的方式来访问该复杂对象(这其实仍是多态性在发挥作用,但在这个多态方法的内部处理使得我们可以做到“用一致的方法访问”这一点,见示例)。原创 2005-07-26 08:30:00 · 2254 阅读 · 1 评论 -
大卫的Design Patterns学习笔记06:Adapter
一、概述Adapter(适配器)模式又称Wrapper模式,主要用于将一个类的接口转换成客户希望的另外一个接口,解决两个已有接口之间不匹配的问题。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。因此,Adapter模式经常被描述成第三方函数库或旧的程序库与现有系统接口/需求不一致时的救星,也正是由于Adapter模式的这种特性,有人也将Adapter模式比喻成变压器,变原创 2005-07-21 08:42:00 · 2300 阅读 · 1 评论 -
大卫的Design Patterns学习笔记01:前言
大卫的Design Patterns学习笔记01:前言一、概述A pattern is a proven solution to a recurring problem within a given context.Design Patterns(设计模式,以下简称DP),源自Christopher Alexander的《建筑的永恒之道》,这个原本与软件设计不相关的概念经GoF(Gang of F原创 2005-07-19 11:39:00 · 3608 阅读 · 1 评论 -
大卫的Design Patterns学习笔记04:Prototype
一、概述Prototype(原型)模式用于动态抽取当前对象运行时的状态,从自身构造出一个新的对象,即自身的拷贝(往往是深拷贝),如果你愿意,你可以叫它Clone模式。二、结构Prototype模式的结构如下图所示: 图1:Prototype模式三、应用Prototype模式在需要拷贝的产品的类型需动态指定时经常被用到。对于类似绘图软件这样的以对象管理为主要目的的应用系统中,各元素往往需要支持动态拷原创 2005-07-20 08:45:00 · 2089 阅读 · 0 评论 -
大卫的Design Patterns学习笔记05:Singleton
一、概述在很多情况下,我们的系统只允许某个类有一个或指定个数的实例,如一般的应用系统往往有且仅有一个log文件操作类实例,或者,整个系统仅有一个等待事务队列等(注意:Singleton不是用来解决整个应用程序仅有一个实例这样的问题的),在这些情况下可以考虑使用Singleton模式。Singleton(单件)模式用于保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。(GoF: Ensure原创 2005-07-20 08:53:00 · 1675 阅读 · 0 评论 -
大卫的Design Patterns学习笔记07:Bridge
一、概述Bridge(桥接)模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。二、结构Bridge模式的结构如下: 图1:Bridge模式类图示意由于Bridge实现抽象-实现的特性,它与Builder模式存在一定的相似性,但二者的区别也是十分显著的,后者更专注于复杂对象的创建,可以认为是Bridge模式的在对象创建方面的一个应用。Bridge模式与Object Adapter模式及后面即原创 2005-07-21 08:45:00 · 2139 阅读 · 1 评论 -
大卫的Design Patterns学习笔记09:Facade
一、概述Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。实际应用中,我们在对付一些老旧的code(尤其是将C的代码转成C++代码)或者即便不是老旧code,但涉及多个子系统时,除了重写全部代码(对于老旧code而言),我们还可能采用这样一种策略:重新进行类的设计,将原来分散在源码中的类/结构及方法重新组合,形成新的、统一的接原创 2005-07-27 08:55:00 · 1851 阅读 · 0 评论 -
大卫的Design Patterns学习笔记10:Flyweight
一、概述当类的部分属性在整个系统中的多个对象间重复出现时,一个通常的作法是将重复出现的属性从类定义中分离出来,并在多个对象间通过共享来节约系统开销,这种情况在界面相关的应用中尤其常见。如用于浏览目录内容的树,每个节点前面有一个Icon用于表示该节点的类型,如果将该Icon保存在每个节点的数据结构中,无疑是一种巨大的浪费,这时候通过共享(每个节点只需要保存一个所使用Icon的标识即可,在C++中,可原创 2005-07-27 08:59:00 · 1923 阅读 · 0 评论 -
大卫的Design Patterns学习笔记12:Proxy
一、概述大家都用过代理服务器,代理服务器是从出发点到目的地之间的中间层。而Proxy模式中的Proxy功能上与此类似,是对象的访问者与对象之间的中间层。Proxy(代理)模式可用于解决在直接访问对象不方便或不符合要求时,为这个对象提供一种代理,以控制对该对象的访问。二、结构Proxy模式的类图结构如下图所示: 图1:Proxy模式类图示意在上面的类图中,Proxy类是Subject类的子类,但个人原创 2005-07-27 09:08:00 · 1999 阅读 · 1 评论 -
大卫的Design Patterns学习笔记16:Iterator
一、概述Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。由于Iterator模式的以上特性:与聚合对象耦合原创 2005-07-28 09:17:00 · 1941 阅读 · 0 评论 -
大卫的Design Patterns学习笔记22:Template Method
一、概述Template Method(模板方法)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里所说的Template跟Generic Programming(范型编程)中讨论的C++的template不是一回事(虽然有一定的相似性),C++的template是一种逻辑复用的方式,它可以不原创 2005-08-04 08:37:00 · 1570 阅读 · 0 评论