设计模式
starsky2006
这个作者很懒,什么都没留下…
展开
-
设计模式学习总结
参考资料程杰.《大话设计模式》《Head First 设计模式》《设计模式:可复用面向对象软件的基础》 基本知识基本概念一个成熟的设计方法不仅要有设计模式,还可有其他类型的模式,如分析模式,用户界面设计模式,或者性能调节模式等等,但是设计模式是最主要的部分。 设计模式可以帮助你重新组织一个设计,同时还能减少以后的重构工作。 设计模式不是代码,而是讲述一些原创 2010-03-19 09:12:00 · 1431 阅读 · 1 评论 -
《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:基于工厂方法的迷宫
示例:基于工厂方法的迷宫实现:.函数CreateMaze建造并返回一个迷宫。这个函数存在的一个问题是它对迷宫、房间、门和墙壁的类进行了硬编码。我们将引入工厂方法以使子类可以选择这些构件。首先,我们将在MazeGame中定义工厂方法以创建迷宫、房间、墙壁和门对象;每一个工厂方法返回一个给定类型的迷宫构件。MazeGame提供一些缺省的实现,它们返回最简单的迷宫、房间、墙壁和门。不同的游戏可以创建MazeGame的子类以特别指明一些迷宫的部件。MazeGame子类可以重定义一些或所有的工厂方法以原创 2010-07-31 16:45:00 · 623 阅读 · 0 评论 -
《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫
示例:基于抽象工厂的迷宫实现: 如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类(abstract class)它的行为包括抽象工厂(abstractFactory)及具体工厂(ContreteFactory);这也是原创 2010-08-09 17:43:00 · 523 阅读 · 0 评论 -
《GOF设计模式》—生成器(Builder)—Delphi源码示例:基于生成器的迷宫
示例:基于生成器的迷宫实现:我们将定义一个CreateMaze成员函数的变体,它以类MazeBuilder的一个生成器对象作为参数。MazeBuilder类定义的接口可以创建:1)、迷宫。2)、有一个特定房间号的房间。3)、在有号码的房间之间的门。GetMaze操作返回这个迷宫给客户。MazeBuilder的子类将重定义这些操作,返回它们所创建的迷宫。原创 2010-08-14 16:42:00 · 640 阅读 · 0 评论 -
《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:参数化工厂方法
示例:参数化工厂方法<br />说明:<br />参数化工厂方法是指通过工厂方法创建多种产品,这个工厂方法采用一个参数来标识要被创建的对象的种类。所有这个工厂方法构建的对象将共享Product接口。<br />重定义一个参数化的工厂方法使你可以简单而有选择性的扩展或改变一个Creator生产的产品。你可以为新产品引入新的标识符,或可以将已有的标识符与不同的产品相关联。<br />实现:<br />Creator的CreateProduct方法是一个参数化的工厂方法,其可以根据ProductID创建不同的Pr原创 2010-08-27 17:40:00 · 995 阅读 · 0 评论 -
《GOF设计模式》—创建型模式—Delphi源码示例:基于创建型模式的迷宫
示例:基于创建型模式的迷宫<br />实现:<br />考虑到MazeGame的成员函数CreatMaze所做的仅是创建一个有两个房间的迷宫,它是相当复杂的。显然有办法使它变得更简单。例如,Room的构造器可以提前用墙壁来初始化房间的每一面。但这仅仅是将代码移到了其他地方。这个成员函数真正的问题不在于它的大小而在于它不灵活。它对迷宫的布局进行硬编码。改变布局意味着改变这个成员函数,或是重定义它—这意味着重新实现整个过程—或是对它的部分进行改变—这容易产生错误并且不利于重用。<br />创建型模式显示如何使得原创 2010-08-27 18:37:00 · 539 阅读 · 0 评论 -
《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:延迟初始化对象
示例:延迟初始化对象<br />说明:<br />在Creator的构造器中不要调用工厂方法—在ConcreteCreator中该工厂方法还不可用。构造器只是将产品初始化为0,而不是创建一个具体产品。访问者返回该产品。但首先它要检查确定该产品的存在,如果产品不存在,访问者就创建它。这种技术有时被称为lazy initialization。<br />代码:<br /> <br />unit FactoryMethodUnit2;<br /> <br />interface<br /> <br />uses<原创 2010-08-27 17:41:00 · 431 阅读 · 0 评论 -
《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于类的工厂
示例:基于类的工厂<br />说明:<br />在将类作为第一类对象的语言中,这个基于原型的方法可能有所变化。你可以将这些语言中的一个类看成是一个退化的工厂,它仅创建一种产品。你可以将类存储在一个具体工厂中,这个具体工厂在变量中创建多个具体的产品,这很像原型。<br />这些类代替具体工厂创建了新的实例。你可以通过使用产品的类而不是子类初始化一个具体工厂的实例,来定义一个新的工厂。这一方法利用了语言的特点,而纯基于原型的方法是与语言无关的。<br />实现:<br />像基于原型的工厂一样,基于类的版本将有原创 2010-08-27 18:12:00 · 374 阅读 · 0 评论 -
《GOF设计模式》—外观(FACADE)—Delphi源码示例:基于外观模式的编译子系统
示例:基于外观的编译子系统<br />实现:<br />让我们仔细观察一下如何在一个编译子系统中使用Facade。<br />编译子系统定义了一个BytecodeStream类,它实现了一个Bytecode对象流(stream)。Bytecode对象封装一个字节码,这个字节码可用于指定机器指令。该子系统中还定义了一个Token类,它封装了编程语言中的标识符。<br />Scanner类接收字符流并产生一个标识符流,一次产生一个标识符(token)。<br />Parser类获取Scanner生成的标识符,然原创 2010-08-27 18:42:00 · 610 阅读 · 0 评论 -
《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:为子类提供挂钩(hook)
<br />示例:为子类提供挂钩(hook)<br />说明:<br />为子类提供挂钩(hook):也叫预设工厂方法。父类的工厂方法实现默认对象,工厂方法给子类一个挂钩以提供对象的扩展版本。<br />钩子是一种被声明在父类中的方法,但只有空的或者默认的实现。钩子的存在可以让子类有能力对实现的进行修改或扩充。要不要挂钩,由子类决定。<br />特点:<br />Creator是一个具体的类而且为工厂方法提供一个缺省的实现。<br />实现:<br />Application类负责管理Document并根据原创 2010-08-27 17:35:00 · 895 阅读 · 0 评论 -
《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:平行的类层级架构
示例:平行的类层级架构<br />说明:<br />当一个类将它的一些职责委托给一个独立的类的时候,就产生了平行类层次。<br />实现:<br />对于可以被交互操纵的图形;它们可以用鼠标进行伸展、移动,或者旋转。实现这样一些交互并不总是那么容易,它通常需要存储和更新在给定时刻记录操纵状态的信息,这个状态仅仅在操纵时需要。因此它不需要被保存在图形对象中。此外,当用户操纵图形时,不同的图形有不同的行为。例如,将直线图形拉长可能会产生一个端点被移动的效果,而伸展正文图形则可能会改变行距。<br />有了这些限原创 2010-08-27 17:38:00 · 568 阅读 · 0 评论 -
《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:抽象工厂接口
示例:抽象工厂接口<br />说明:<br />(1)、定义<br />父类提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类;子类决定创建一系列依赖的具体对象。<br />(2)、结构<br /><br /> <br />工厂<br />AbstractFactory:抽象工厂,声明一个创建抽象产品对象的操作接口。<br />ConcreteFactory:具体工厂,实现创建具体产品对象的操作。<br />产品<br />AbstractProduct:抽象产品,为一类产品对象声明一个接口原创 2010-08-27 18:06:00 · 455 阅读 · 0 评论 -
《GOF设计模式》—生成器(Builder)—Delphi源码示例:生成器接口
示例:生成器接口<br />说明:<br />(1)、定义<br />将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。<br />(2)、结构<br /><br /> <br />生成器<br />Builder:抽象生成器,为创建一个Product对象的各个部件指定抽象接口。<br />ConcreteBuilder:具体生成器,实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口来取得Product(例如,GetASCIITex原创 2010-08-27 18:24:00 · 684 阅读 · 1 评论 -
《GOF设计模式》—生成器(Builder)—Delphi源码示例:RTF阅读器
示例:RTF阅读器<br />特点:<br />通常情况下,由具体生成器生成的产品,它们的表示相差是如此之大以至于给不同的产品以公共父类没有太大意思。因为客户通常用合适的具体生成器来配置导向者,客户处于的位置使它知道Builder的哪一个具体子类被使用,以及能处理具体Builder生成的产品。<br />实现:<br />一个RTF(RichTextFormat)文档交换格式的阅读器应能将RTF转换为多种正文格式,如该阅读器可以将RTF文档转换成普通ASCII文本。但问题在于“格式转换”的数目可能是无限的。原创 2010-08-27 18:26:00 · 702 阅读 · 0 评论 -
《GOF设计模式》—生成器(Builder)—Delphi源码示例:编译子系统中的Parser类
示例:编译子系统中的Parser类<br />实现:<br />编译子系统中的Parser类是一个Director,它以一个ProgramNodeBuilder对象作为参数。每当Parser对象识别出一个语法结构时,它就通知它的ProgramNodeBuilder对象。当这个语法分析器做完时,它向该生成器请求它生成的语法分析树并将语法分析树返回给客户。<br />代码:<br />参考“外观模式”中“基于外观模式的编译子系统”中Parser类的实现原创 2010-08-27 18:27:00 · 378 阅读 · 0 评论 -
《GOF设计模式》—生成器(Builder)—Delphi源码示例:ClassBuilder
示例:ClassBuilder<br />实现:<br />ClassBuilder是一个生成器,Class使用它为自己创建子类。在这个例子中,一个Class既是Director也是Product。<br />代码:<br /> <br /> <br />unit uClassBuilder;<br /> <br />interface<br /> <br />uses<br /> SysUtils;<br /> <br />type<br /> TClassBuilder = class;<b原创 2010-08-27 18:28:00 · 435 阅读 · 0 评论 -
《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:工厂方法接口
示例:工厂方法接口示例:工厂方法接口说明:(1)、定义父类定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。(2)、结构对象: TProduct:产品。 TContreteProduct:具体产品。工厂: TCreator:工厂,声明工厂方法,该方法返回一个TProduct对象。 TContreteCreator:具体工厂,改写工厂方法(override)以返回一个TContreteProduc实例。特点:Creator类是一个抽原创 2010-08-27 17:32:00 · 372 阅读 · 0 评论 -
《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:用户界面工具包
示例:用户界面工具包<br />特点:<br />当你提供一个产品类库,而只想显示它们的接口而不是实现时。<br />实现:<br />考虑一个支持多种视感(look-and-feel)标准的用户界面工具包,例如Motif和PresentationManager。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。<br /原创 2010-08-27 18:08:00 · 446 阅读 · 0 评论 -
《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于原型的工厂
示例:基于原型的工厂<br />说明:<br />如果有多个可能的产品系列,具体工厂也可以使用Prototype模式来实现。具体工厂使用产品系列中每一个产品的原型实例来初始化,且它通过复制它的原型来创建新的产品。在基于原型的方法中,使得不是每个新的产品系列都需要一个新的具体工厂类。<br />实现:<br />此处是Smalltalk中实现一个基于原型的工厂的方法。具体工厂在一个被称为partCatalog的字典中存储将被复制的原型,方法make检索该原型并复制它,方法addPart用来向该字典中增加部件原原创 2010-08-27 18:09:00 · 385 阅读 · 0 评论 -
《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:参数化的工厂
示例:参数化的工厂<br />说明:<br />AbstractFactory通常为每一种它可以生产的产品定义一个操作。产品的种类被编码在操作型构中。增加一种新的产品要求改变AbstractFactory的接口以及所有与它相关的类。一个更灵活但不太安全的设计是给创建对象的操作增加一个参数。该参数指定了将被创建的对象的种类。它可以是一个类标识符、一个整数、一个字符串,或其他任何可以标识这种产品的东西。<br />在Delphi这样的动态类型语言中。仅当所有对象都有相同的抽象基类,或者当产品对象可以被请求它们的原创 2010-08-27 18:13:00 · 361 阅读 · 0 评论 -
《GOF设计模式》—生成器(Builder)—Delphi源码示例:编译子系统中的ByteCodeStream
示例:编译子系统中的ByteCodeStream<br />实现:<br />ByteCodeStream是一个生成器,它将一个被编译了的方法创建为字节数组。Bytecode对象封装一个字节码,这个字节码可用于指定机器指令。ByteCodeStream不是Builder模式的标准使用,因为它生成的复杂对象被编码为一个字节数组,而不是正常的Smalltalk对象。但ByteCodeStream的接口是一个典型的生成器,而且将很容易用一个将程序表示为复合对象的不同的类来替换ByteCodeStream。<br原创 2010-08-27 18:27:00 · 360 阅读 · 0 评论 -
《GOF设计模式》—创建型模式—Delphi源码示例:未基于模式的迷宫
<br />示例:简单的迷宫<br />实现:<br />我们将举一个通用的例子—为一个电脑游戏创建一个迷宫—来说明它们的实现。这个迷宫和游戏将随着各种模式不同而略有区别。有时这个游戏将仅仅是找到一个迷宫的出口;在这种情况下,游戏者可能仅能见到该迷宫的局部。有时迷宫包括一些要解决的问题和要战胜的危险,并且这些游戏可能会提供已经被探索过的那部分迷宫地图。<br />我们将忽略许多迷宫中的细节以及一个迷宫游戏中有一个还是多个游戏者。我们仅关注迷宫是怎样被创建的。我们将一个迷宫定义为一系列房间,一个房间知道它的邻原创 2010-08-27 18:35:00 · 474 阅读 · 0 评论 -
《GOF设计模式》—原型(Prototype)—Delphi源码示例:原型接口
<br />示例:原型接口<br />说明:<br />(1)、定义<br />用原型实例指定要创建对象的种类,并且通过拷贝这些原型实例创建新的同类对象。<br />(2)、结构<br /><br /><br />原型<br />Prototype:抽象原型,声明一个克隆自身的接口。<br />ConcretePrototype:具体原型,实现一个克隆自身的操作。<br />客户端<br />Client:让一个原型克隆自身从而创建一个新的对象。<br />代码:<br />unit uPrototype;原创 2010-09-14 17:39:00 · 599 阅读 · 0 评论 -
《GOF设计模式》—原型(Prototype)—Delphi源码示例:乐谱编辑器
<br />示例:乐谱编辑器<br />实现:<br />你可以通过定制一个通用的图形编辑器框架和增加一些表示音符、休止符和五线谱的新对象来构造一个乐谱编辑器。这个编辑器框架可能有一个工具选择板用于将这些音乐对象加到乐谱中。这个选择板可能还包括选择、移动和其他操纵音乐对象的工具。用户可以点击四分音符工具并使用它将四分音符加到乐谱中。或者他们可以使用移动工具在五线谱上上下移动一个音符,从而改变它的音调。<br />我们假定该框架为音符和五线谱这样的图形构件提供了一个抽象的Graphics类。此外,为定义选择板原创 2010-09-14 17:42:00 · 982 阅读 · 0 评论 -
《GOF设计模式》—原型(Prototype)—Delphi源码示例:电路设计编辑器
<br />示例:电路设计编辑器<br />实现:<br />电路设计编辑器是由子电路来构造电路的。为方便起见,这样的应用通常允许你实例化复杂的、用户定义的子电路结构,比方说,一次又一次的重复使用一个特定的子电路。<br />使用Prototype模式,我们仅需将这个子电路作为一个原型增加到可用的电路元素选择板中。只要组合电路对象将Clone实现为一个深拷贝,具有不同结构的电路就可以是原型了。<br />特点:<br />(1)、改变结构以指定新对象。<br />许多应用由部件和子部件来创建对象。<br /原创 2010-09-14 17:53:00 · 403 阅读 · 0 评论 -
《GOF设计模式》—原型(Prototype)—Delphi源码示例:基于实例的原型管理器
<br />示例:基于实例的原型管理器<br />说明:<br />当一个系统中原型数目不固定时(也就是说,它们可以动态创建和销毁),要保持一个可用原型的注册表。客户不会自己来管理原型,但会在注册表中存储和检索原型。客户在克隆一个原型前会向注册表请求该原型。我们称这个注册表为原型管理器(PrototypeManager)。<br />原型管理器是一个关联存储器(associativestore),它返回一个与给定关键字相匹配的原型。它有一些操作可以用来通过关键字注册原型和解除注册。客户可以在运行时更改甚或浏原创 2010-09-14 17:58:00 · 367 阅读 · 0 评论 -
《GOF设计模式》—原型(Prototype)—Delphi源码示例:基于类的原型管理器(使用TStringList实现)
<br />示例:基于类的原型管理器(使用TStringList实现)<br />代码:<br /><br /><br />unit uClassManager1;<br /> <br />interface<br /> <br />uses<br /> SysUtils,Classes,Dialogs;<br /> <br />type<br /> TBaseObjectClass = class of TBaseObject;<br /> <br /> TBaseObject = cl原创 2010-09-14 18:06:00 · 301 阅读 · 0 评论 -
《GOF设计模式》—原型(Prototype)—Delphi源码示例:基于类的原型管理器(使用TList和TObject对象服务实现)
<br />示例:基于类的原型管理器(使用TList和TObject对象服务实现)<br />代码:<br /><br /><br />unit uClassManager;<br /> <br />interface<br /> <br />uses<br /> SysUtils,Classes,Dialogs;<br /> <br />type<br /> TBaseObjectClass = class of TBaseObject;<br /> <br /> TBaseObject原创 2010-09-14 18:08:00 · 390 阅读 · 0 评论 -
《GOF设计模式》—原型(Prototype)—Delphi源码示例:基于类的原型管理器(使用TList实现)
<br />示例:基于类的原型管理器(使用TList实现)<br />实现:<br />应用程序启动时自动注册每个类,并用类管理器来管理这个注册类。然后应用程序从配置文件中获取动态装载类的信息,并向类管理器请求该注册类以创建实例,这些类原本并没有和程序相连接。<br />代码:<br /><br /><br />unit uClassManager1;<br /> <br />interface<br /> <br />uses<br /> SysUtils,Classes,Dialogs;<br /原创 2010-09-14 18:04:00 · 313 阅读 · 0 评论 -
《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:桥接接口
示例:桥接接口<br />说明:<br />(1)、定义<br />将抽象部分与它的实现部分分离,使它们都可以独立地变化。<br />(2)、结构<br /><br /><br />抽象类:<br />Abstraction:定义抽象类的接口。维护一个指向Implementor类型对象的指针。<br />RefinedAbstraction:扩充由Abstraction定义的接口。<br />实现类:<br />Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;原创 2010-11-27 13:57:00 · 398 阅读 · 0 评论 -
《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:可移植的用户界面
示例:可移植的用户界面<br />说明:<br /> <br />代码:<br /> <br />unit uWindow;<br /> <br />interface<br /> <br />uses<br />Windows,SysUtils,Classes,Graphics; <br /> <br />type<br /> TWindow = class;<br /> TWindowImp = class;<br /> <br /> {窗口视图}<br /> TView = c原创 2010-11-27 14:12:00 · 412 阅读 · 0 评论 -
《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:仅有一个Implementor
示例:仅有一个Implementor<br />说明:<br />在仅有一个实现的时候,没有必要创建一个抽象的Implementor类。这是Bridge模式的退化情况;在Abstraction与Implementor之间有一种一对一的关系。尽管如此,当你希望改变一个类的实现不会影响已有的客户程序时,模式的分离机制还是非常有用的—也就是说,不必重新编译它们,仅需重新连接即可(例如,Abstraction在主程序实现,Implementor在DLL中实现)。<br /> <br />代码:<br /><br /原创 2010-11-27 14:18:00 · 307 阅读 · 0 评论 -
《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:创建正确的Implementor对象(参数)
<br />示例:创建正确的Implementor对象(参数)<br />说明:<br />如果Abstraction知道所有的ConcreteImplementor类,它就可以在它的构造器中对其中的一个类进行实例化,它可以通过传递给构造器的参数确定实例化哪一个类。<br />例如,如果一个collection类支持多重实现,就可以根据collection的大小决定实例化哪一个类。链表的实现可以用于较小的collection类,而hash表则可用于较大的collection类。<br /> <br />代码原创 2010-11-27 14:19:00 · 331 阅读 · 0 评论 -
《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:创建正确的Implementor对象(缺省的实现)
<br />示例:创建正确的Implementor对象(缺省的实现)<br />说明:<br />创建正确Implementor对象的另外一种方法是首先选择一个缺省的实现,然后根据需要改变这个实现。<br />例如,如果一个collection的大小超出了一定的阈值时,它将会切换它的实现,使之更适用于表目较多的collection。<br /> <br />代码:<br /> <br />unit uBridge3;<br /> <br />interface<br /> <br />uses<br />原创 2010-11-27 14:21:00 · 310 阅读 · 0 评论 -
《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:共享Implementor对象
示例:共享Implementor对象<br />说明:<br />Coplien阐明了如何用C++中常用的Handle/Body方法在多个对象间共享一些实现。其中Body有一个对象引用计数器,Handle对它进行增减操作。<br /> <br />代码:<br />unit uHandle;<br /> <br />interface<br /> <br />uses<br /> Dialogs;<br /> <br />type<br /> TBody = class<br /> pri原创 2010-11-27 14:22:00 · 435 阅读 · 0 评论 -
《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:组合接口
示例:组合接口<br />说明:<br />(1)、定义<br />将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。<br />(2)、结构<br /><br /><br /> <br />组合:<br />Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它(可选)。<br />L原创 2010-11-27 14:25:00 · 420 阅读 · 0 评论 -
《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:绘图编辑器
示例:绘图编辑器<br />说明:<br /><br /><br /><br /><br />代码:<br /><br />unit uGraphic;<br /> <br />interface<br /> <br />uses<br /> Windows,SysUtils,Classes,Graphics,Types;<br /> <br />type<br /> TGraphic = class<br /> protected<br /> FCanvas: TCanva原创 2010-11-27 14:27:00 · 360 阅读 · 0 评论 -
《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:显式的父部件引用
示例:显式的父部件引用<br />说明:<br />保持从子部件到父部件的引用能简化组合结构的遍历和管理。父部件引用可以简化结构的上移和组件的删除,同时父部件引用也支持职责链 (Chain of Responsibility)模式。<br />通常在Component类中定义父部件引用。Leaf和Composite类可以继承这个引用以及管理这个引用的那些操作。<br />对于父部件引用,必须维护一个不变式,即一个组合的所有子节点以这个组合为父节点,而反之该组合以这些节点为子节点。保证这一点最容易的办法是,仅原创 2010-11-27 14:32:00 · 416 阅读 · 0 评论 -
《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:最大化Component接口
示例:最大化Component接口<br />说明:<br />Composite模式的目的之一是使得用户不知道他们正在使用的具体的Leaf和Composite类。为了达到这一目的,Composite类应为Leaf和Composite类尽可能多定义一些公共操作。Composite类通常为这些操作提供缺省的实现,而Leaf和Composite子类可以对它们进行重定义。<br />然而,这个目标有时可能会与类层次结构设计原则相冲突,该原则规定:一个类只能定义那些对它的子类有意义的操作。有许多Component所原创 2010-11-27 14:35:00 · 486 阅读 · 0 评论 -
《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:声明管理子部件的操作(安全性设计)
<br />示例:安全性设计<br />说明:<br />一种办法是在Component类中声明一个返回空指针的缺省操作GetComposite():TComposite。Composite类重新定义这个操作并通过this指针返回它自身。GetComposite允许你查询一个组件看它是否是一个组合,你可以对返回的组合安全地执行Add和Remove操作。<br />当然,这里的问题是我们对所有的组件的处理并不一致。在进行适当的动作之前,我们必须检测不同的类型。<br /> <br />代码:<br />uni原创 2010-11-27 14:37:00 · 318 阅读 · 0 评论