design pattern
oec2003
我搬到新的博客了,http://blog.fwhyy.com 欢迎大家访问
微信公众号:不止dotNET
展开
-
初学设计模式的一点理解
说起设计模式,不得不提的是GoF23种设计模式,这些设计模式是在历史性的一本经典著作《设计模式:可复用面向对象软件的基础》被描述的,这本书的四位作者并称为Gang of Four(GoF) 。由于这本书极具影响力,所以我们通常所说的设计模式就隐含地表示为“面向对象设计模式”,但这并不意味着“设计模式”就等同于“面向对象设计模式”。 很多人认为设计模式就是一种法原创 2006-12-22 09:08:00 · 1009 阅读 · 0 评论 -
设计模式笔记(21)---备忘录模式(行为型)
Gof定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。动机在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性原创 2010-01-28 09:13:00 · 748 阅读 · 0 评论 -
设计模式笔记(8)---桥接模式(结构型)
Gof定义将抽象部分与实现部分分离,使他们都可以独立地变化。先来看一个简单的例子,假设我们需要开发一个同时支持PC和手机的坦克游戏,游戏在PC和手机上的功能都一样,有同样的类型,有同样的功能需求变化,而这些游戏中的坦克有多种不同的型号:T50 T60等。根据面向对象的思想,我们可以很容易设计一个坦克(Tank)的抽象类,然后不同的型号都继承抽象类,并且PC和手机上的图形绘制,操作等都是不相原创 2009-12-04 12:55:00 · 615 阅读 · 0 评论 -
设计模式笔记(23)---策略者模式(行为型)
Gof定义定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客 户而变化。动机在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?看下面的策略者模式的结构图和基原创 2010-02-01 08:52:00 · 843 阅读 · 0 评论 -
设计模式笔记(24)---访问者模式(行为型)
Gof定义表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。动机在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题原创 2010-02-03 08:48:00 · 790 阅读 · 0 评论 -
设计模式笔记(9)---组合模式(结构型)
Gof定义将对象组合成树形结构以表示“部分--整体”的层次结构。Composite使得用户对单个对象和组合对象使用具有一致性。在面向对象系统中,我们经常会遇到一类具有”容器“特征的对象---即他们在充当对象的同时,又是其他对象的容器。比如在一些管理系统中就会出现总公司下面有很多的分公司,分公司下面有很多的部门,每个部门下又有很多的员工,像分公司和部门就是既充当了“对象”的角色也充当了“容器原创 2009-12-07 14:56:00 · 586 阅读 · 0 评论 -
设计模式笔记(25)---总结
断断续续经历了几个月的时间将WebCast的设计模式讲座重新完整听了一遍,并做了笔记,才有了这个设计模式笔记系列,本系列的文章大部分只是给出了基本代码的实现,而并没有去衍生其他的一些例子,笔者认为通过基本的代码实现就能够了解到模式的应用场景,弄出些花哨的例子反倒会让人眼花缭乱,可能并达不到预期的效果,毕竟在实际的应用中我们不是去套用模式。本文作为该系列的最后一篇,将对设计模式做个总结。首先看下原创 2010-02-04 08:38:00 · 748 阅读 · 4 评论 -
设计模式笔记(12)---享元模式(结构型)
Gof定义运用共享技术有效地支持大量细粒度的对象。动机采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?这需要用到享元模式,不过应用享元模式是需要进行评估的,也就是说在当前情况下是否会对系统造成性能上的影响,如果会那么就是用,下原创 2009-12-09 15:26:00 · 679 阅读 · 0 评论 -
设计模式笔记(11)---外观模式(结构型)
Gof定义为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。先来看个小例子,假设我们需要开发一个坦克模拟系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎、控制器、车轮、车身等各子系统构成。就会有下面这些类的产生public class Wheel{ }public class Engine{ }pub原创 2009-12-09 08:45:00 · 633 阅读 · 0 评论 -
设计模式笔记(13)---代理模式(结构型)
Gof定义为其他对象提供一种代理以控制对这个对象的访问。动机在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。看下结构图: Subject:该类中定义了一些Rea原创 2009-12-12 13:53:00 · 701 阅读 · 0 评论 -
设计模式笔记(14)---模板方法模式(行为型)
Gof定义定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个 算法的结构即可重定义该算法的某些特定步骤。动机在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤原创 2009-12-14 10:15:00 · 853 阅读 · 0 评论 -
设计模式笔记(6)---原型模式(创建型)
Gof定义使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。动机在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,但由于需求的变化,这些对象将成面临着剧烈的变化,但他们拥有比较稳定一致的接口。假设在一些打斗游戏场景中,有这样一些角色,普通(NormalActor),可以飞的(FlyActor),可以潜水的(WaterActor)public原创 2009-11-28 21:04:00 · 633 阅读 · 0 评论 -
设计模式笔记(22)---状态模式(行为型)
Gof定义允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。动机在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?看下面状态模式的结构图和代码。状态模式结构图: 日常生原创 2010-01-29 08:58:00 · 768 阅读 · 0 评论 -
设计模式笔记(7)---适配器模式(结构型)
Gof定义将一个类的接口转换成客户所希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。动机在软件系统中,由于应用环境的变化,常常要将“一些现存的对象”放在心的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。适配的意思是在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。在我们的生活中有着很多适配器的例子,笔记本的电源适配原创 2009-11-30 09:23:00 · 596 阅读 · 0 评论 -
设计模式笔记(1)---开篇
概念设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象的设计模式描述了面向对象设计过程中,在特定场景下类与相互通讯的对象之间常见的组织关系。设计模式与面向对象面向对象设计模式解决的是“类与相互通信的对象之间的组织关系。包括他们的角色、职责、协作方式几个方面。面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”是那些可以满足“因对变化,提高复原创 2009-11-18 09:20:00 · 749 阅读 · 0 评论 -
设计模式笔记(2)---单件模式(创建型)
Gof 定义保证一个类仅有一个实例,并提供一个该实例的全局访问点动机保证在系统中只存在一个实例,这样才能保证逻辑的正确性和良好的效率单件模式单线程环境下实现看下面一段代码:public class Singleton{ private static Singleton _instance; //定义为私有,让类的使用者不能直接new一个该类原创 2009-11-20 09:25:00 · 953 阅读 · 0 评论 -
设计模式笔记(3)---抽象工厂模式(创建型)
Gof定义提供一个借口,让该接口负责创建一系列相关或者相互依赖的对象,无需指定他们具体的类。动机在软件系统中经常面临着一系列相互依赖的对象的创建的工作,同时由于需求的变化,往往存在着更对系列对象的创建。常规的对象创建的方法,直接使用new关键字Road road = new Road();这样直接new会有一个问题,不能应对具体实例化类型的变化,比如说有不同的原创 2009-11-23 11:24:00 · 654 阅读 · 0 评论 -
设计模式笔记(5)---工厂方法模式(创建型)
Gof定义定义一种用于创建对象的借口,让子类决定实例化哪一个类,Factory Method使得一个类的实例化延迟到子类。动机在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的借口。假设有这样的一个场景,有一个汽车类和一个汽车测试框架类,汽车测试框架负责对汽车来进行测试,通常情况下我们会想下面这样写。p原创 2009-11-24 08:54:00 · 590 阅读 · 0 评论 -
设计模式笔记(17)---中介者模式(行为型)
Gof定义用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。动机在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合原创 2010-01-21 14:07:00 · 852 阅读 · 0 评论 -
设计模式笔记(4)---生成器模式(创建型)
Gof定义将一个复杂对象的构建与其表示相分离,使其同样的构建过程可以创建不同的表示。动机在软件系统中,有时侯面临着一个复杂对象的创建工作,这个发展对象通常是由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂的对象的各个部分经常面临着巨大的变化,但是将他们组合起来的算法相对稳定。还是拿游戏中的房屋作为例子来讲,房屋由门、窗户、墙、地板、天花板组成。这些组成部分可能是经原创 2009-11-23 17:28:00 · 591 阅读 · 0 评论 -
设计模式笔记(16)---解释器模式(行为型)
Gof定义给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句 子。动机在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。下面看下解释器模式的结构图原创 2010-01-20 09:26:00 · 676 阅读 · 2 评论 -
设计模式笔记(18)---迭代器模式(行为型)
Gof定义提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露该对象的内部表示。动机在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提原创 2010-01-25 08:44:00 · 606 阅读 · 0 评论 -
设计模式笔记(19)---观察者模式(行为型)
Gof定义定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通 知并自动更新动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。原创 2010-01-26 08:42:00 · 750 阅读 · 0 评论 -
设计模式笔记(20)---职责链模式(行为型)
Gof定义使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。动机在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使原创 2010-01-27 08:46:00 · 637 阅读 · 0 评论 -
设计模式笔记(15)---命令模式(行为型)
Gof定义将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。动机在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需 要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一原创 2010-01-04 09:00:00 · 719 阅读 · 0 评论