07 2012 档案
摘要:问题:在面向对象的设计中和开发中,经常会遇到,有一些请求或操作,很难用对象的形式来表示或者处理,比如我们写一个简单的算术计算工具计算“a+b”,可以简单的定义一个方法,接收两个变量,做算术“+”计算返回结果,可是如果让这个方法可以实现“加减乘除”四则运算,我们又要修改方法加入一个运算符参数,但是由于需求变化,又要加入多个操作数的运算如:“a+b-c*d”,该如何处理呢?穷举方法定义所有可能出现的操作显然是不可能的,我们能否定义一种来解析算术表达式的方法,直接将算术表达式作为字符串传递给计算方法,计算方法将算术表达式解析后再计算返回结果?定义:Interpreter模式是一种行为模式,给定一个.
阅读全文
摘要:问题:在面向对象的设计中和开发中,经常会遇到,同一类型的对象(由同一个class new出)会在不同的场景中出现多次,可是由于应用场景不同,他们的状态(属性值)又有所不同,但是他们的大多数属性又都是相同的,我们需要在不同的应用场景中创建大量具有不同状态的对象,然而大量的对象会造成很大的系统存储开销,以及对象的创建时的性能开销。定义:享元模式(又叫:轻量级模式)是一种结构型模式,运用共享技术有效地支持大量细粒度的对象。意图:抽出多个同一对象在不同应用场景中的共同状态(intrinsic,在不同的应用场景中相对不变的),封装在一个可以被共享的元类中(Concrete Flyweight),并提供.
阅读全文
摘要:问题:在面向对象的设计中,经常会遇到有多个对象共同处理同一事件,但是各自对事件的处理权限却有不同的场合,一个比较简单的例子就是逐级审批,组长审批完成后,交给经理审批,经理审批完成交给总监,总监审批完给总裁...比较传统的解决办法就是,由客户端来判断,现在处于哪个阶段,下一步应调用哪个对象的方法,进入哪一个阶段,可是请求的发送者需要维护多个耦合,以处理请求信息的传达。这就存在请求的发送者与多个接收者之间是高耦合。定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者的耦合关系,将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理了它为止。意图:Chain of Respons.
阅读全文
摘要:问题:在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为。我们可以采用switch…case语句来解决问题,但是,如果这种状态变化比较频繁(状态的数量会变化),状态、判断逻辑、行为耦合在一起,当系统中需要加入新的状态时,必须修改判断逻辑(加入新的case...)。定义:状态模式(State Pattern)是一种行为模式。当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。意图:定义一个Context,接收客户端配置的具体状态对象,并将与状态相关的请求委托给当前的ConcreteState对象处理,并将Context自身作为一个参数传递给处理该请求的状态.
阅读全文
摘要:问题:在某些情况下,一类具有“容器特征”的对象在充当对象的同时,又是其他对象的容器的情况,比如树状结构的对象,如果客户过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构的变化将引起客户代码的频繁变化。如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器? 定义:组合(Composite )模式是构造型的设计模式之一,是指将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得客户对单个对象和组合对象的使用具有一致性。意图:提供一个Component角色,它定义了访问与管理部件(部分-整体)的.
阅读全文
摘要:问题:在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。•当由于某些特定的需要调用的对象在另外一台机器上,需要跨越网络才能访问,在没有WebService的情况下我们需要直接coding去处理网络连接、处理打包、解包等等非常复杂的步骤,而WebService的出现帮我们解决了其中的一些问题简化客户端的处理,我们只需在客户端建立一个远程对象的代理,客户端就象调用本地对象一样调用该代理,再由代理去跟实际对象联系,对于客户端来说可能根本没有感觉到调用的东西在网络另外一端。定义:对其他对象提供一种代理以控制对这个对象的访问。意图:提供一个Sub.
阅读全文
摘要:问题:在面向对象系统的设计和开发中,在某些特定的场景下,需要在运行时不改变对象类的前提下动态的为已经定义好的对象添加新的职责(操作),使用继承时将会创建出大量的子类,而且继承的实现都是静态的,客户端不能在运行期(runtime)根据环境需要灵活控制改变组合添加的多个功能。定义:动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活。意图:提供一个Decorator角色,它维护了一个需要装饰的Component具体对象的索引,Decorator收所有的来自客户端的请求,转发这些请求给Component之前或以后增加一些附加功能来装饰Component。这样就确保了在运行.
阅读全文
摘要:问题:在程序设计中,我们可能由于某种特定的需要,复制一个对象的结构,与对象的值,动态的获取获取对象运行时的状态,最简单的解决办法是 new 一个对象新的对象,然后将对象的属性值一一赋值给新的对象,这样要一一列出对象的属性赋值,操作起来太复杂,而且及其容易出错,落下某个属性的赋值。能否让对象本身提供一个自我复制的功能,客户端只需简单的调用这个方法就能完成对象的复制。定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。意图:Prototype模式允许一个已存在的对象通过创建的接口(Clone),通过拷贝自己来实施创建另外一个可定制的对象(定制好属性值然后批量复制),根本无需知道.
阅读全文
摘要:问题:在面向对象系统的分析与设计过程中经常会遇到,对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。这时候我们一般需要把逻辑(算法)框架放在抽象基类中,并定义好细节的接口,采用继承的方式在子类中实现细节。定义:模板方法模式是类的行为模,定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可以重定义算法的某些特定步骤。意图:Template是采用继承的方式实现算法的异构,将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现,使得子类可以置换掉父类的可变部分,但是子类却不可以改变模板.
阅读全文
摘要:问题:在软件系统中,有时面临着一个复杂对象的创建工作,通常是由很多其他的对象按一定的规则顺序组合而成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的规则是相对稳定(结构和顺序)。这时候我们需要把这个复杂对象的创建过程和这个对象的表示(展示)分离开来,使得可以使用同样的构建过程创建不同的对象 表示。定义:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。意图:提供一个建造者Builder对象,他规定了创建一个复杂对象需要的部件,通过Director指定的创建规则,调用Builder中的具体部件,并指挥Builder返回一个具体的对象。.
阅读全文
摘要:问题:在面向对象的设计中,抽象是一个很重要的概念,所谓抽象就是忽略一类对象的特殊特性,提出一些共有的特性,暂时忽略一些细节,而对与此类对象的变化可以使用继承的手段在子类中完成,换言之,用继承来应对抽象的变化。在软件系统中,当抽象由于某种原因也容易变动,使得对象从两个维度或更多方向上发生改变。使用继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比继承方案更好的解决方法。定义:桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化。意图:Bridge模式,系统被分为抽象(Abstraction)和实现
阅读全文
摘要:问题:在软件系统开发中经常需要为某些对象建立一些依赖关系,而这些依赖于该对象的依赖者会根据该对象的状态变化,触发某些事件或方法也做出相应的改变,我们怎么样建立这种依赖关系,并做到当对象状态发生变化时对依赖对象的通知?定义:观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。意图:提.
阅读全文
摘要:问题:在软件系统开发中经常会遇到这样的情况,在一个系统中实现了一些接口(模块),而这些接口(模块)都分布在几个类或几个子系统模块中比如A和B、C、D,各自实现了一些功能接口。然后对于客户,并不知道或并不想知道,这些功能接口是怎么样实现的,是在哪里实现的。外观模式可以为一个复杂的系统(有很多分布在不同类或子系统中的方法)提供一个简单的供客户端调用的接口,使耦合大大降低定义:外观模式(Facade,也叫门面模式)是一种构造型设计模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。意图:提供一个接口,这个接口能够把其他可重用类(代码,子系统).
阅读全文