文章分类 - 设计模式_李建忠_笔记
1
摘要:对象状态影响对象行为对象拥有不同的状态,往往会行驶不同的行为...动机(Motivation)在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为可能完全不同如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作转化之间引入紧耦合?意图(Intent)允许一个对象在其内部状态改变它的行为。从而使对象看起来似乎修改了其...
阅读全文
摘要:发布-订阅模型动机(Motivation)在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系"---一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系,从而实现软件体系的松耦合。意图(Intent)定义对象间的一种一对多的依赖关系,以便当一个...
阅读全文
摘要:集合内部结构与外部访问动机(Motivation)在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同事这种"透明遍历"也为"同一种算法在多种集合对象上进行操作"提供了可能。使用面向对象技术将这种遍历机制抽象为"迭代器对象"应对变化中的集合对象提供了一种优雅的方式。意图(Intent)提供一种方法顺序访...
阅读全文
摘要:依赖关系的变化动机(Motivation)在软件构建过程中,经常会初现多个uixiang互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,我们可使用一个"中介对象"来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。意图(Intent)用一个中介对象来封装一系列的对象交互。中介者使各对...
阅读全文
摘要:动机(Motivation)在软件构建中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的变成方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则情况下,然后构建一个解释器(解释器并不一样)来解释这样的句子,从而达到解决问题的目的。意图(Intent)给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。 ...
阅读全文
摘要:耦合与变化耦合是软件不能抵御变化灾难的根本性原因,不仅实体对象与实体对象之间存在耦合关系,实习对象与行为操作之间也存在耦合关系。动机(Motivation)在软件构建过程中,"行为请求者"与"行为执行者"通常呈现一种"紧耦合"。但在某些场合---比如需要对行为"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象...
阅读全文
摘要:(虚函数的晚绑定,简单但是重要)变与不变变化---是软件设计永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现系统中的变化点和稳定点,并使用特定的设计方法来应对这种变化。动机(Motivation)在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却又很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实...
阅读全文
摘要:直接与间接人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活、满足特定需求的解决方案。动机(Motivation)在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。意图(Intent)为其他对象提供一种代理以控制对这个对象的访问 ---《设计模式》Go...
阅读全文
摘要:系统的复杂度需要开发一个坦克模拟系统用于模拟坦克车在各种环境中的行为,其中坦克系统由引擎、控制器、车轮、车身等各子系统构成。 public class Wheel { public void WAction1() { } public void WAction2() { } } public class Bodywork { public void BAction1() { } public vo...
阅读全文
摘要:子类复子类,子类何其多假如我们需要为游戏开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合下为其为其增加一种或多种功能:比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等。 //抽象坦克 public abstract class Tank { public abstract void Shot(); public abstract void Run(); } //各种型号 pu...
阅读全文
摘要:对象容器的问题在面向对象系统中,我们常会遇到一类具有"容器"特征的对象---即它们在充当对象的同时,又是其他对象的容器。代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--publicinterfaceIBox{}publicclassSingleBo...
阅读全文
摘要:抽象不应该依赖于实现细节,实现细节应该依赖于抽象抽象B --- 稳定实现细节b --- 变化问题在于如果抽象B由于固有的原因,本身也不稳定,也有可能变化、怎么办?举例来说假如我们需要开发一个同时支持PC和手机的坦克游戏,游戏在PC和手机上功能都一样,都有同样的类型,面临同样的功能需求变化,比如坦克可能有多种不同的型号:T50,T75,T90...对于其中的坦克设计,我们可能很容易设计出来一个Tan...
阅读全文
摘要:结构型模式 --- 处理类组合的问题适配,即在不改变原有实现基础上,将原先不兼容的接口转换为兼容的接口。动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应多这种"迁移的变化"?如何既能利用现有对象的良好表现,同时又能满足新的应用环境所要求的接口?将一个类的接口转换成客户希望的另一个接口。...
阅读全文
摘要:·Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建模式解决的都是new所带来的耦合关系(易变类与客户程序的关系)。·Abstract Factory,Builder,Factory Method都需要一个额外的工厂类来负责实例化"易变对象",而Prototype则是通过原型(一个特殊的工厂类)来克隆"易变对象"。·如果遇到"易变类...
阅读全文
摘要:依赖关系的倒置抽象不应该依赖于实现细节,实现细节应该依赖于抽象动机(Motivation)在软件系统中,经常面临着"某些结构复杂的对象"的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向"客户程序"(使用这些对象的程序)"隔离出"这些易变对象",从而使得"依赖这些易变对象的客户程序"不随着需求改变而改变?意图(Intent)使用原型...
阅读全文
摘要:Factory Method --- 工厂方法从耦合关系谈起耦合关系直接决定着软件面对变化时的行为--模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改--模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保持不变软件需求的变化不应该是工程师抱怨的问题,而应该是工程师要解决的问题主要的部分---抽象的高层部分---变化慢细节的部分---具体的实现部分-...
阅读全文
摘要:·如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正...分析,构建房屋的组成结构是稳定的,但是房屋的窗口,门的风格可能并不固定动机(Motivation)在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化...
阅读全文
摘要:new 的问题常规的对象创建方法: Road road = new Road(); -- 实现依赖,不能应对“具体实例化类型”的变化。解决思路: -- 封装变化点--哪里变化,封装哪里 -- 潜台词:如果没有变化,当然不需要额外的封装工厂模式的缘起·变化点在"对象创建",因此就封装"对象创建"·面向接口编程--依赖接口,而非依赖实现·最简单的解...
阅读全文
摘要:singleton --- 独生子,独生生活 --- 保证一个类仅有一个实例,并提供一个该实例的全局访问点模式分类从目的来看--- 创建型(Creational)模式:负责对象创建--- 结构型(Structural)模式:处理类与对象间的组合--- 行为型(Behavioral)模式:类与对象交互中的职责分配。从范围来看:--- 类模式处理类与子类的静态关系--- 对象模式处理对象间的动态关系动...
阅读全文
摘要:对象从概念层面---对象是拥有责任的抽象从规格层面---对象是一系列可以对其他对象使用的公共接口从语言实现层面来看---对象封装了代码和数据怎么设计?1.遵循面向对象设计的原则2.熟悉一些典型的设计模式设计原则--->设计模式·针对接口编程,而不是针对实现编程---客户(调用程序的程序)无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口·优先使用对象组合,而...
阅读全文
1