版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2/182很多系统的解决方案都比较类似很多系统的解决方案都比较类似解决方案的共同点是什么?区别在何处?用到哪些特殊的方法?如何制定一个特殊的方法?3/182表示软件系统的基本结构化组织图式。提供一个用于细化软件系统的子系统或组件,或它们之间关系的图式。4/182体系结构模式体系结构模式可作为具体软件体系结构的模版。它们规定一个应用的系统范围的结构特性,以及对其子系统的体系结构施加的影响。体系结构模式的选择是开发一个软件系统时的基本设计决策。5/182设计模式设计模式软件体系结构的子系统,以及它们之间的关系。通常 由几个更小的体系结构单元构成。中等规模的模式。规模上比体系结构模式小,但又独立于特
2、定编程语言。设计模式的应用对软件系统的基础结构没有影响,但可能对子系统的体系结构有所影响。提供分解更复杂的服务或组件的结构,以及它们之间的合作。6/182惯用法惯用法处理特定设计问题的实现代表最低层模式,关注设计和实现方面针对具体语言,捕获现有的编程经验7/182一个模式关注一个在特定设计环境中出现的设计一个模式关注一个在特定设计环境中出现的设计问题,并为它提供一个解决方案。问题,并为它提供一个解决方案。各种模式用文档记录下现存的经过充分考验的设各种模式用文档记录下现存的经过充分考验的设计经验。计经验。模式为设计原则提供一种公共的词汇和理解。模式为设计原则提供一种公共的词汇和理解。模式是为软件
3、体系结构建立文档的一种手段。模式是为软件体系结构建立文档的一种手段。模式支持用已定义的属性来构造软件。模式支持用已定义的属性来构造软件。8/182语境:问题出现的场景语境:问题出现的场景问题:在那个语境中出现的再现问题问题:在那个语境中出现的再现问题解决方案必须满足的需求必须考虑的约束解决方案必须具有的特性解决方案:已被证实的问题的解决方案解决方案:已被证实的问题的解决方案特定的结构:组件和关系的结构运行期的行为9/182模式的图式:模式的图式:10/182 架构模式架构模式 设计模式设计模式 物理体系结构建模物理体系结构建模11/182 架构模式架构模式 设计模式设计模式 物理体系结构建模物
4、理体系结构建模12/182一个软件体系结构的模式描述了一个出一个软件体系结构的模式描述了一个出现在特定设计语境中的特殊的再现设计现在特定设计语境中的特殊的再现设计问题,并为它的解决方案提供了一个经问题,并为它的解决方案提供了一个经过充分验证的通用图式。过充分验证的通用图式。一组预先确定的子系统和他们的职责子系统间的相互关联的规则例如: Model-View-Controller模式13/18214/182层体系结构模式有助于构建这样的应用:层体系结构模式有助于构建这样的应用: 它能被分解成子任务组,其中每个子任务组它能被分解成子任务组,其中每个子任务组处于一个特定的抽象层次上。处于一个特定的抽
5、象层次上。下层为上层提供服务上层利用下层提供的服务完成自身的任务通过同步程序调用来完成请求的服务15/18216/182一个独立层的描述一个独立层的描述17/182举例:虚拟机举例:虚拟机e.g. JVM举例:举例: APIse.g. C standard library, built on Unix system calls举例:信息系统举例:信息系统应用层数据库表示层应用逻辑层领域层数据库18/182举例:举例:Windows NT系统服务:子系统和NT执行程序之间的接口层资源管理器层:包含对象管理器、安全引用监视器、过程管理器、I/O管理器、虚拟存储管理器和局部过程调用等模块。内核:它关
6、心一些基本功能,如中断和意外处理、多处理器同步、线程调度和现程分配。硬件抽象层(HAL):隐藏了不同处理器系列机器之间的硬件差异。硬件19/18220/182优点:优点:层的重用标准化支持局部性依赖可替换性不足不足更改行为的重叠降低效率不必要的工作难以认可层的正确粒度21/18222/182将一个交互式应用程序分为三个组件。将一个交互式应用程序分为三个组件。模型模型(Model):核心功能和数据:核心功能和数据视图视图(Views):向用户显示信息:向用户显示信息控制器控制器(Controllers):处理用户输入:处理用户输入视图和控制器共同构成了用户接口视图和控制器共同构成了用户接口变更变
7、更-传播机制确保了用户接口和模型之间的一致性传播机制确保了用户接口和模型之间的一致性23/18224/18225/182相同的信息在不同的窗口有不同的表示相同的信息在不同的窗口有不同的表示支持不同的支持不同的“样式和感觉样式和感觉”标准标准模型独立于表示模型独立于表示布告形式连接布告形式连接观察者设计模式举例:举例:SmalltalkASP.NET .aspx:视图:视图 .VB,.C#:控制:控制26/18227/182服务器端为客户端提供服务服务器端为客户端提供服务客户端从服务器端请求服务客户端从服务器端请求服务服务器一直保持监听请求的状态服务器一直保持监听请求的状态举例:举例:远程数据库
8、连接远程文件系统多层信息系统Web 应用28/18229/182支持容错性、并行计算以及计算准确性。支持容错性、并行计算以及计算准确性。主控组件将工作分配给相同的从属组件,并主控组件将工作分配给相同的从属组件,并从从属组件返回的结果中计算最终的结果。从从属组件返回的结果中计算最终的结果。举例:举例:嵌入式系统大规模并行计算容错系统30/18231/18232/182主控模块故障,整个系统故障主控模块故障,整个系统故障主控模块将任务划分为几个同等的子任务主控模块将任务划分为几个同等的子任务从属之间相互独立从属之间相互独立从属之间并行工作从属之间并行工作问题是可以分解的问题是可以分解的应用领域:应
9、用领域:容错并行计算计算准确性33/182优点:优点:可互换性和可扩充性事务分离效率不足:不足:可行性对机器依赖性难以实现可移植性34/18235/182管道和过滤器体系结构模式,为处理数据流的系统提供管道和过滤器体系结构模式,为处理数据流的系统提供了一种结构了一种结构每个处理步骤封装在一个过滤器组件中每个处理步骤封装在一个过滤器组件中数据通过相邻过滤器之间的管道传输数据通过相邻过滤器之间的管道传输管道处理缓冲和同步重组过滤器可以建立相关系统族重组过滤器可以建立相关系统族举例:举例:编译器Unix 内核命令36/18237/18238/182优点:优点:通过过滤器交换增加了灵活性通过重组增加了
10、灵活性过滤器组件的重用并行处理提高效率不足:不足:共享状态信息或者昂贵或者不灵活并行处理获得的效率往往只一种假象数据转换额外开销错误处理39/18240/182代理者结构模式可以用于构建带有隔离组件的分布式代理者结构模式可以用于构建带有隔离组件的分布式软件系统,该软件通过远程服务调用进行交互。软件系统,该软件通过远程服务调用进行交互。代理者组件负责协调通信代理者组件负责协调通信转发请求、传送结果和异常服务器将他们的服务(属性和操作)发布给一个代理服务器将他们的服务(属性和操作)发布给一个代理客户端通过一个代理请求服务器处理客户端通过一个代理请求服务器处理代理将请求发送给一个合适的服务器处理代理
11、将请求发送给一个合适的服务器处理41/182允许动态改变、添加、删除和重新发布允许动态改变、添加、删除和重新发布对于开发者来说,代理是透明的对于开发者来说,代理是透明的请求需要有标准的表示法请求需要有标准的表示法当两个代理者互操作时,实现细节可通过网桥来隐藏当两个代理者互操作时,实现细节可通过网桥来隐藏举例:举例:公共对象请求代理体系结构(CORBA),处理异构系统上分布式对象的面向对象技术Web services42/18243/18244/182对称的对称的 客户机客户机-服务器模式服务器模式客户机向服务器请求服务服务器通知客户机特定的事件任何一个节点都可以扮演客户机或者服务器的角色可以动
12、态的交换角色举例:举例:多用户应用P2P 技术45/18246/182事件源将消息发布到总线上的特殊通道上事件源将消息发布到总线上的特殊通道上事件监听者订阅通道上的消息事件监听者订阅通道上的消息监听者监听有效消息监听者监听有效消息消息是异步的消息是异步的通路可以是固定的通路可以是固定的47/18248/182黑板体系结构模式对于无确定性求解策略的问题比较有用。黑板体系结构模式对于无确定性求解策略的问题比较有用。黑板模式中,有几个专用子系统收集其知识,以建立一个可能的部分解或近似解。举例: 语音识别所有组件共享数据存储(黑板)所有组件共享数据存储(黑板)组件生成新的数据更新到黑板组件生成新的数据
13、更新到黑板组件监视黑板上的数据组件监视黑板上的数据利用匹配模式寻找特定的数据49/18250/18251/182优点:优点:对可更改性和可维护性的支持可重用的知识源支持容错性和健壮性不足:不足:测试困难不能保证有好的求解方案难以建立一个好的控制策略低效昂贵的开发工作缺少对并行机制的支持52/182 架构模式架构模式 设计模式设计模式 物理体系结构建模物理体系结构建模53/182 Abstract factory(抽象工厂) 提供一个创建一系列相关或相互依赖对象的接口,提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。而无需制定它们具体的类。 Adapter(适配器) 将一个类
14、的接口转换成客户希望的另一个接口。它将一个类的接口转换成客户希望的另一个接口。它使得原本由于接口不兼容而不能在一起工作的那些使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。类可以在一起工作。 Bridge (桥接) 将抽象部分与它的实现部分分离,使它们都可以独将抽象部分与它的实现部分分离,使它们都可以独立的变化。立的变化。54/182 Builder(生成器) 将一个复杂对象的构建与它的表示分离,使得同样的构建过将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。程可以创建不同的表示。 Chain of Responsibility(职责链) 为解除请求的发
15、送者和接受者之间的耦合,而使多个对象都为解除请求的发送者和接受者之间的耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这个有机会处理这个请求。将这些对象连成一条链,并沿着这个链传递该请求,直到有一个对象处理它。链传递该请求,直到有一个对象处理它。 Command (命令) 将一个请求封装成一个对象,从而使你可用不同的请求对客将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。消的操作。55/182 Composite(组成) 将对象组合成树型结构以表示将对象组合
16、成树型结构以表示“部分部分-整体整体”的层次结构。它使的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。得客户对单个对象和复合对象的使用具有一致性。 Decorator(装饰) 动态的给一个对象添加一些额外的职责。就扩展功能而言,该动态的给一个对象添加一些额外的职责。就扩展功能而言,该模式比生成子类的方式更为灵活。模式比生成子类的方式更为灵活。 Facade (外观) 为子系统中的一组接口提供一个已知的界面,该模式定义了一为子系统中的一组接口提供一个已知的界面,该模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。个高层接口,这个接口使得这一子系统更加容易使用。56/182
17、Factory Method(工厂方法) 定义一个用于创建对象的接口,让子类决定将哪一个类定义一个用于创建对象的接口,让子类决定将哪一个类实例化。它使得一个类的实例化延迟到其子类。实例化。它使得一个类的实例化延迟到其子类。 Flyweight(享元) 运用共享技术有效地支持大量细粒度的对象。运用共享技术有效地支持大量细粒度的对象。 Interpreter (解释器) 给定一个语言,定义它的文法的一种表示,并定义一个给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。解释器,该解释器使用该表示来解释语言中的句子。57/182 Iterator(迭代器)
18、提供一种方法顺序访问一个聚合对象中的各个元素,而又不需提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。暴露该对象的内部表示。 Mediator(中介者) 用一个中介对象来封装一些列的对象交互。中介者使各对象不用一个中介对象来封装一些列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。变它们之间的交互。 Memento (备忘录) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以
19、后就可将该对象恢复到保存的对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。状态。58/182 Observer(观察者) 定义对象间的一种一对多的依赖关系,以便当一个对象定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。自动刷新。 Prototype(原型) 用原型实例制定创建对象的种类,并通过拷贝这个原型用原型实例制定创建对象的种类,并通过拷贝这个原型来创建新的对象。来创建新的对象。 Proxy (代理) 为其他对象提供一个代理以控制对这个对象的访问。为其他对象提供一个代理以控
20、制对这个对象的访问。59/182 Singleton(单件) 保证一个类仅有一个实例,并提供一个访问它的全局访保证一个类仅有一个实例,并提供一个访问它的全局访问点。问点。 State(状态) 允许一个对象在其内部状态改变时改变它的行为。对象允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了他所属的类。看起来似乎修改了他所属的类。 Strategy (策略) 定义一系列算法,把它们一个个封装起来,并且使它们定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的可相互替换。本模式使得算法的变化可独立于使用它的客户。客户。60/182 Temp
21、late Method(模版方法) 定义一个操作中的算法的骨架,而将一些步骤延迟到子定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。该模式使得子类可以不改变一个算法的结构即可类中。该模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。重定义该算法的某些特定步骤。 Visitor(访问者) 表示一个作用于某对象结构中的各元素的操作。它使你表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素可以在不改变各元素的类的前提下定义作用于这些元素的新操作。的新操作。61/182目的目的创建型创建型结构型结构型行为型行为型范范围围类类 Fac
22、tory MethodAdapter(类类)InterpreterTemplate Method对对象象Abstract FactoryBuilderPrototypeSingletonAdapter(对象对象)BridgeCompositeDecoratorFaadeFlyweightProxyChain of ResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor62/182 优点 面向接口编程面向接口编程 创建型模式确保系统是采用针对接口的方式书写的,而不是针对实现而书写的。 降低耦合性降低耦合性
23、增加灵活性增加灵活性63/182 创建型模式 将系统使用哪些具体的类的信息封装起来将系统使用哪些具体的类的信息封装起来 隐藏了这些类的实例是如何被创建和放在一隐藏了这些类的实例是如何被创建和放在一起的起的64/182 客户类和工厂类分开。客户任何时候需要某种产品,只需向工厂请求即可。客户无须修改就可以接纳新产品。 缺点是当产品修改时,工厂类也要做相应的修改。65/18266/18267/18268/18269/18270/182 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method 使一个类的实例化延迟
24、到其子类。使一个类的实例化延迟到其子类。 适用性:适用性: 当一个类不知道它所必须创建的对象的类的时候; 当一个类希望由它的子类来指定它所创建的对象的时候 当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候71/182 结构参与者 Product定义工厂方法所创建的对象的接口 ConcreteProduct实现Product接口 Creator声明工厂方法,该方法返回一个声明工厂方法,该方法返回一个Product类型的对象。类型的对象。可以调用工厂方法以创建一个可以调用工厂方法以创建一个Product对象。对象。 ConcreteCreato
25、r重定义工厂方法以返回一个ConcreteProduct实例72/182 协作 Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例73/182public abstract class CarFactory public abstract Car creator();public class VM1Factory extends Factorypublic Car creator().return new Carpublic class VM2Factory extends Factorypublic Car creator().return n
26、ew Car 74/182 意图 提供一个创建一系列相关或相互依赖对象的接口,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。而无需指定它们具体的类。 75/182 参与者 AbstractFactory声明一个创建抽象产品对象的操作接口声明一个创建抽象产品对象的操作接口 ConcreteFactory实现创建具体产品对象的操作实现创建具体产品对象的操作 AbstractProduct为一类产品对象声明一个接口为一类产品对象声明一个接口 ConcreteProduct 定义一个将被相应的具体工厂创建的产品对象 实现AbstractProduct接口 Client 仅使用由仅
27、使用由AbstractFactory和和AbstractProduct类声明的接口类声明的接口 协作 通常在运行时刻创建一个通常在运行时刻创建一个ConcreteFactory类的实例。这一具体类的实例。这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象,的工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应适用不同的具体工厂。客户应适用不同的具体工厂。 AbstractFactory将产品对象的创建延迟到它的将产品对象的创建延迟到它的ConcreteFactory子类。子类。76/182public abstract class CarFactory public abs
28、tract Car creator();public abstract Truck creator(String s); public class VM1Factory extends Factorypublic Car creator().return new Jettapublic Truck creator(String s).return new BigBigpublic class VM2 extends Factorypublic Car creator().return new Polo public Truck creator(String s).return new LLL7
29、7/182 与与Factory Method模式的比较模式的比较 Factory Method模式 利用给利用给Factory对象传递不同的参数,以返回对象传递不同的参数,以返回具有相同基类或实现了同一接口的对象具有相同基类或实现了同一接口的对象 Abstract Factory模式 先利用先利用Factory模式返回模式返回Factory对象,再通对象,再通过过Factory对象返回不同的对象对象返回不同的对象78/182 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造模式可以强制实行一种分步骤进行的建造过程。 79/182 参与者: Builder为创建一
30、个为创建一个Product对象的各个部件制对象的各个部件制定抽象接口。定抽象接口。 ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件 定义并明确它所创建的表示 提供一个检索产品的接口 Derector构造一个使用构造一个使用Builder接口的对象接口的对象 Product 表示被构造的复杂对象 包含定义组成部件的类80/182 协作: 客户创建客户创建Director对象,并用它所想要的对象,并用它所想要的Builder对对象进行配置象进行配置 一旦产品部件被生成,导向器就会通知生成器一旦产品部件被生成,导向器就会通知生成器 生成器处理导向器的请求,并将部
31、件添加到该产品生成器处理导向器的请求,并将部件添加到该产品中中 客户从生成器中检索产品客户从生成器中检索产品81/182public interface Builder /创建部件A:比如汽车车轮void buildPartA(); /创建部件B:比如方向盘void buildPartB(); /创建部件C:比如发动机void buildPartC(); /返回最终组装产品成果 (返回最后装配好的汽车)/成品的组装过程不在这里进行,而是转移到下面的Director中进行。/从而实现过程与部件的解耦。Product getResult(); public class Director priva
32、te Builder builder; public Director( Builder builder ) this.builder = builder; / 将partA, partB, partC最后组成复杂物件/汽车的组装过程public void construct() builder.buildPartA();builder.buildPartB();builder.buildPartC(); 82/182意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 其实是将product和factory功能合
33、二为一了。缺点是每一个类都必须配备一个克隆方法。适用性:当一个系统应该独立于它的产品创建、构成和表示时,要使用当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式;以及模式;以及当要实例化的类是在运行时刻指定时;或者当要实例化的类是在运行时刻指定时;或者为了避免创建一个与产品类层次平行的工厂类层次时;或者为了避免创建一个与产品类层次平行的工厂类层次时;或者当一个类的实例只能由几个不同状态组合中的一种时。建立相应数目的当一个类的实例只能由几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。原型并克隆它们可能比每次用合适的
34、状态手工实例化该类更方便一些。83/182参与者 Prototype声明一个克隆自身的接口。声明一个克隆自身的接口。 ConcretePrototype实现一个克隆自身的操作。实现一个克隆自身的操作。 Client让一个原型克隆自身从而创建一个新的对象。让一个原型克隆自身从而创建一个新的对象。协作 客户请求一个原型克隆自身客户请求一个原型克隆自身84/182public abstract class AbstractSpoon implements Cloneable String spoonName; public void setSpoonName(String spoonName) th
35、is.spoonName = spoonName;public String getSpoonName() return this.spoonName;public Object clone() Object object = null;try object = super.clone(); catch (CloneNotSupportedException exception) System.err.println(AbstractSpoon is not Cloneable);return object;public class SoupSpoon extends AbstractSpoo
36、n public SoupSpoon()setSpoonName(Soup Spoon); public class SaladSpoon extends AbstractSpoon public SaladSpoon()setSpoonName(Salad Spoon); 85/182意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。保证一个类仅有一个实例,并提供一个访问它的全局访问点。 类自身负责保存它的唯一实例。解决的主要是性能问题,而非耦合(变化)的问题。适用性 当类只能由一个实例而且客户可以从一个众所周知的访问点访问当类只能由一个实例而且客户可以从一个众所周知的访问点访问它
37、时它时 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。更改代码就能使用一个扩展的实例时。86/182参与者 Singleton定义一个Instance操作,允许客户访问它的唯一实例。可能负责创建它自己的唯一实例。协作 客户只能通过客户只能通过Singleton的的Instance操作访问一个操作访问一个Singleton实例。实例。87/182public class Singleton private static Singleton instance = null;public static
38、 synchronized Singleton getInstance() /这个方法比上面有所改进,不用每次都进行生成对象, /只是第一次使用时生成实例,提高了效率!if (instance=null)instancenew Singleton();return instance; 88/182 创建型模式规定了创建对象的方式。在必须决定实例化创建型模式规定了创建对象的方式。在必须决定实例化某个类时,使用这些模式。某个类时,使用这些模式。 通常,由抽象超类封装实例化类的细节,这些细节包括通常,由抽象超类封装实例化类的细节,这些细节包括这些类确切是什么,以及如何及何时创建这些类。这些类确切是什
39、么,以及如何及何时创建这些类。 对客户类来讲,这些类的细节是隐藏的。客户类只知道对客户类来讲,这些类的细节是隐藏的。客户类只知道抽象类或抽象类实现的接口。客户类通常并不知道具体抽象类或抽象类实现的接口。客户类通常并不知道具体类的确切类型。类的确切类型。 当系统演化依赖于对象的组合、聚集时,创建型模式带当系统演化依赖于对象的组合、聚集时,创建型模式带来了更大的灵活性。来了更大的灵活性。89/182 结构型模式 如何组合类和对象以获得更大的结构如何组合类和对象以获得更大的结构 类模型采用继承机制来组合接口或实现,如采用多重继承方法将两个以上的类组合成一个类 对象模式不是对接口和实现进行组合,它描述
40、了如何对一些对象进行组合,从而实现新功能的一些方法。在运行时刻改变对象组合关系,具有更大的灵活性。90/182 把一个类的接口变换成客户端所期待的另一种把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。起工作的两个类能够一起工作。 适配类可以根据参数返还一个合适的实例给客适配类可以根据参数返还一个合适的实例给客户端。户端。91/18292/18293/182 参与者 Target定义定义Client使用的与特定另一相关的接口使用的与特定另一相关的接口 Client与符合与符合Target接口的对象
41、协同接口的对象协同 Adaptee定义一个已经存在的接口,这个接口需要适配定义一个已经存在的接口,这个接口需要适配 Adapter对对Adaptee的接口与的接口与Target接口进行适配接口进行适配 协作 Client在在Adapter实例上调用一些操作。接着适配器调用实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。的操作实现这个请求。94/182public interface IRoundPegpublic void insertIntoHole(String msg);public interface ISquarePegpublic void insert(Str
42、ing str);public class PegAdapter implements IRoundPeg, ISquarePegprivate RoundPeg roundPeg;private SquarePeg squarePeg;/ 构造方法 public PegAdapter(RoundPeg peg)this.roundPeg=peg; / 构造方法 public PegAdapter(SquarePeg peg)this.squarePeg=peg; public void insert(String str) roundPeg.insertIntoHole(str); publ
43、ic void insertIntoHole(String str)SquarePeg.insert(str);95/18296/182 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 解决2个方面的变化问题:抽象与实现。即一个类中多个方向的变化问题。 97/182 参与者参与者 Abstraction 定义抽象类的接口定义抽象类的接口 维护一个指向维护一个指向Implementor类型对象的指针类型对象的指针 RefinedAbstraction扩充由Abstraction定义的接口 Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。 Co
44、ncreteImplementor实现Implementor接口并定义它的具体实现 协作协作 Abstraction将Client的请求转发给它的Implementor对象98/182public abstract class CoffeeCoffeeImp coffeeImp;public void setCoffeeImp() this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();public SodaImp getCoffeeImp() return this.CoffeeImp;public abstract void pourCof
45、fee();public abstract class CoffeeImppublic abstract void pourCoffeeImp();/bridgepublic class CoffeeImpSingleton private static CoffeeImp coffeeImp; public CoffeeImpSingleton(CoffeeImp coffeeImpIn) this.coffeeImp = coffeeImpIn;public static CoffeeImp getTheCoffeeImp()return coffeeImp;99/182100/18210
46、1/182 合成模式把部分与整体关系用树结构表示。 合成模式使得用户对单个对象和组合对象的使用具有一致性。102/182103/182 参与者 Component 为组合中的对象声明接口 在适当的情况下,实现所有类共有接口的缺省行为 声明一个接口用于访问和管理Component的子组件 (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它 Leaf 在组合中表示叶节点对象,叶节点没有子节点 在组合中定义图元对象的行为 Composite 定义有子部件的那些部件的行为 存储子部件 在Component接口中实现与子部件有关的操作 Client 通过Component接口操
47、纵组合部件的对象104/182 协作 用户使用用户使用Component类接口与组合结构中的对类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直象进行交互。如果接收者是一个叶节点,则直接处理请求。如果接收者是接处理请求。如果接收者是Composite,它通,它通常将请求发送给它的子部件,在转发请求之前常将请求发送给它的子部件,在转发请求之前与与/或之后,可能执行一些辅助操作。或之后,可能执行一些辅助操作。105/182public abstract class Equipmentprivate String name; /网络价格 public abstract double ne
48、tPrice();/打折价格public abstract double discountPrice();/增加部件public boolean add(Equipment equipment) return false; /刪除部件public boolean remove(Equipment equipment) return false; /注意这里,提供一种用于访问组合部件的方法。public Iterator iter() return null; public Equipment(final String name) =name; public class Dis
49、k extends Equipmentabstract class CompositeEquipment extends Equipment 106/182意图 动态地给一个对象添加一些额外的职责。就增加功能来说,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。模式相比生成子类更为灵活。一个类可能有些额外的责任(除了主体业务操作),如加密、缓存、压缩等,这些可能只是辅助主体业务的附着,并不严格按照维度变化。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消
50、。增加由一些基本功能的排列组合而产生的非常大量的功能。既继承又组合,实际上是将Bridge中的抽象和实现合二为一了,是其特殊形式。 107/182参与者Component定义一个对象接口,可以给这些对象动态地添加职责。定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent定义一个对象,可以给这个对象添加一些职责。定义一个对象,可以给这个对象添加一些职责。Decorator维持一个指向维持一个指向Component对象的指针,并定义一个与对象的指针,并定义一个与 Component接口一致的接口接口一致的接口ConcreteDecorator向组件添加职责。向组件添加
51、职责。协作Decorator将请求转发给它的将请求转发给它的Component对象,并有可能在转发请求前对象,并有可能在转发请求前后执行一些附加的动作后执行一些附加的动作108/182public interface Work public void insert(); public class SquarePeg implements Workpublic void insert()System.out.println(“方形杵插入); public class Decorator implements Work private Work work;/额外增加的功能打包在List中 priv
52、ate ArrayList others = new ArrayList(); /在构造器中使用组合new方式,引入Work;public Decorator(Work work)this.work=work; others.add(“挖坑); others.add(“钉木板); public void insert() newMethod(); /新方法中在insert之前增加其他方法, 这里次序先后是用户灵活指定的 public void newMethod()otherMethod();work.insert(); public void otherMethod()ListIterato
53、r listIterator = others.listIterator();while (listIterator.hasNext()System.out.println(String)(listIterator.next() + “ 正在进行); 109/182外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。 110/182 参与者参与者Facade 知道哪些子系统类负责处理请求知道哪些子系统类负责处理请求 将客户的请求代理给
54、适当的子系统对象将客户的请求代理给适当的子系统对象Subsystem 实现子系统的功能实现子系统的功能 处理由处理由FacadeFacade对象指派的任务对象指派的任务 没有没有FacadeFacade的任何相关信息;即没有指向的任何相关信息;即没有指向FacadeFacade的指针的指针 协作协作客户程序通过发送给Facade的方式与子系统通讯, Facade将这些消息转发给适当的子系统对象。尽管是子系统中有关对象在做实际工作,但Facade模式本身也必须将它的接口转换成子系统的接口。使用Facade的客户程序不需要直接访问子系统对象。111/182public class DBCompar
55、e String sql = “SELECT * FROM WHERE = ?”;try Mysql msql=new mysql(sql); prep.setString( 1, “” ); rset = prep.executeQuery(); if( rset.next() ) System.out.println( rset.getString( “” ) ); catch( SException e ) e.printStackTrace(); finally mysql.close(); mysql=null;112/182 享元模式以共享的方式高效的支持大量的细粒度对象。 采用类
56、似于Hash表的方式,共享的思想。 客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。 享元模式大幅度的降低内存中对象的数量,主要解决OO性能问题。113/182114/182参与者Flyweight 描述一个接口,通过这个接口Flyweight可以接受并作用于外部状态。ConcreteFlyweight 实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。UnsharedConcreteFlyweight 并非所有的Flyweight子类都需要被共享。 Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,
57、 UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。FlyweightFactory 创建并管理Flyweight对象 确保合理地共享Flyweight。Client 维持一个对Flyweight的引用 计算或存储一个(多个) Flyweight的外部状态115/182 协作 Flywelght执行时所需的状态必定是内部的或外部的。执行时所需的状态必定是内部的或外部的。内部状态存储于内部状态存储于ConcreteFlyweight对象之中;而外对象之中;而外部对象则由部对象则由Client对象存储或计算。当用户调用对象存储或计算。当用
58、户调用Flywelght对象的操作时,将该状态传递给它。对象的操作时,将该状态传递给它。 用户不应直接对用户不应直接对ConcreteFlyweight类进行实例话,类进行实例话,而只能从而只能从FlywelghtFactory对象得到对象得到ConcreteFlyweight对象,这可以保证对它们适当地对象,这可以保证对它们适当地进行共享。进行共享。116/182public class CD private String title;private int year;private Artist artist;public String getTitle() return title; p
59、ublic int getYear() return year; public Artist getArtist() return artist; public void setTitle(String t) title = t; public void setYear(int y) year = y; public void setArtist(Artist a) artist = a; public class Artist /内部状态private String name; / note that Artist is immutable.String getName() return n
60、ame; Artist(String n) name = n; public class ArtistFactory Hashtable pool = new Hashtable();Artist getArtist(String key)Artist result;result = (Artist)pool.get(key);/产生新的Artistif(result = null) result = new Artist(key);pool.put(key,result); return result;117/182 代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。 代
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024三个小孩抚养权协议及共同财产分割合同6篇
- 2025年服装机械项目申请报告模板
- 2024-2025学年新疆维吾尔阿勒泰地区数学三上期末统考模拟试题含解析
- 2024-2025学年武功县数学三年级第一学期期末联考试题含解析
- 去工厂实习报告模板十篇
- 2024年消防喷淋安装施工总承包合同文件
- 超市的实习报告四篇
- 2025年伺服系统项目申请报告模稿
- 2025年咖啡机项目规划申请报告
- 2024年度水电供应专用合同合同一
- 电力电子技术(广东工业大学)智慧树知到期末考试答案章节答案2024年广东工业大学
- 奇门遁甲在现代商业竞争中的应用
- 绩效考核评分标准
- 电力建设施工技术管理
- 股权投资邮箱
- 江苏省全日制劳动合同书模板
- (完整版)八年级下册所有古诗及文言文(人教版)
- 铝合金搅拌摩擦焊的工艺研究
- JGP9L-6(10)(Y)(ZNCK-4A)-霍工090608结构图电子版的
- 拉威尔悼念公主的帕凡舞曲钢琴谱Ravel-Pavane pour une Infante Defunte乐谱
- GB∕T 39937-2021 塑料制品 聚丙烯(PP)挤塑板材 要求和试验方法
评论
0/150
提交评论