软件设计模式

ningbe

贡献于2011-12-06

字数:0 关键词:

第四讲 软件设计模式 Computer School, WUST http://www.cs.wust.edu.cn 申明与致谢 本讲义内容参考潘爱民博 士有关《Design Pattern 》和李英军,马晓星,蔡敏,刘建 中等人翻译的设计模式-可复用 面向对 象软 件的基础。特此感谢!件的基础。特此感谢! 主要内容 软件复用的概念和方法 软件组件技术 软件设计模式 软件体系结构和体系结构 风格 主要内容 软件复用的概念和方法 软件组件技术 软件设计模式 软件体系结构和体系结构 风格 软件设计模式简史 “四人组”将模式描述为“在一 定的环 境中 解决某一问题的方案”。 这三个 事物— 问 题、解决方案和环境 — 是模式的基本要素 。给模式一个名称,考虑 使用模 式将产 生。给模式一个名称,考虑 使用模 式将产 生 的结果和提供一个或多个 示例, 对于说 明 模式也都是有用的。 模式的编目方法 模式名称和分类:模式的 概念性 句柄和 类别 意图(Intent ):模式 解决什 么样的 问题? 别名:模式的其它常见名 称 动机:阐明问题的方案 适用性:在什么情况下使 用模式? 结构:使用“对象建模技 术(Object Modeling Technique ,OMT)”的 图图 参与者:设计中的类和对 象 协作:设计中的类和对象 如何协 作 结果:模式实现了哪些目 标?它 又失去 了什么? 实现:要考虑的实现细节、特定 语言问 题 样本代码:用 Smalltalk 和 C++ 语言编写的样本代码 已知应用:现实世界中的 示例 相关模式:对相关模式的 比较和 讨论 模式的编目方法 《模式 Java 版》使用下列模板: 模式名称:模式的名称和对模式进行第一次描述时的引用 提要(Synopsis ):模式的简短描述 环境:对模式要解决的问题的描述 推动力:促使解决方案形成所需考虑事项的描述推动力:促使解决方案形成所需考虑事项的描述 解决方案:一般解决方案的描述 结果:使用模式的结论 实现:要考虑的实现细节 Java API 用法:当 Java API 可用时,是指 Java API 的示例 代码示例:用 Java 语言编写的代码示例 相关模式:一组相关模式 如何学习模式 首先要学习的最重要内容 是每个 模式的 意图和 环境: 这个模 式在什 么情 况下要解决什么问题。本 教程只 讲述一 些最重 要的模 式,接 下来, 对 于那些勤奋的开发人员, 建议浏 览一些 类别并 挑出关 于每个 模式的 信 息。在《设计模式》中, 要阅读 的相关 章节是“意图”、“ 动机” 和 “适用性”。在《模式 Java 版》中,相关章节是“提要”、“ 环境 ”和“推动力与解决方案”。 进行背景研究可以帮助您 确定一 种模式,这种 模式能 提供所 面临的 设计 问题的一种解决方案。然 后,在 详细考 虑这个 解决方 案和它 的结果 之问题的一种解决方案。然 后,在 详细考 虑这个 解决方 案和它 的结果 之 后,针对适用性,进一步 评估这 个候选 模式。 如果不 行,可 以看看 相 关模式。 在某些情况下,可能会发 现可以 有效地 使用多 个模式。而在 另一些 情况 下,可能没有合适的模式,或者 在性能 或复杂 性方面,使用 合适的 模 式可能成本过高,而特定 的解决 方案可 能是最 好的办 法。 模式的作用 重用良好的设计风格及设 计类及 对象。 模式的作用 在设计面向对象的软件中,关键步骤是发现对象。这里有许 多技术可以帮助发现对象,例如:用例(use case )、协 作图(collaboration diagram )或“类-职责-协作(Class- Responsibility-Collaboration ,CRC)”卡,但是发现对 象对于经验匮乏的设计人员来说是最困难的一步。 缺少经验或指导会导致过多的对象,而这些对象存在过多的缺少经验或指导会导致过多的对象,而这些对象存在过多的 交互及由此产生的相关性,对于所创建的整体式系统,很 难维护而且不可能重用。这违背了面向对象设计的初衷。 设计模式帮助克服这类问题,因为它们传授从专家的经验中 提炼出来的教训:模式文档专门技术。而且,模式不仅描 述如何构造软件,更重要的是,还描述了类和对象如何交 互(特别是在运行时)。明确地考虑这些交互及其结果会 带来更灵活、可重用的软件。 设计模式分类 分类方法:首先根据模式 的目的 准则进 行分 类,可分为创建型(Creatinoal )、结构 型 (Structural )、行为型(Behavioral )三 种种 然后根据范围准则,指模 式主要 是适用 于对 象还是类。所谓类属模式 是指这 些模式 关 系是通过静态建立起来的,在编 译之间 就 已经确定下来。而对象属 模式是 指这些 模 式的关系是可以动态变化 的。 模式分类 目 的 创建型 结构型 行为型 Factory Method (工厂方法) Adapter (适配器) Interpreter ( 解释器) Template Method (模板方法) Abstract Factory (抽象工厂) Builder (生 成器) Prototype (原型) Singleton (单 件) Adapter (适配器) Bridage (桥接) Composite (组成) Decorator (装饰) Fa çade (外观) Flyweight (享元) Proxy (代理) Chain of Responsibility (职责链 ) Command (命令) Iterator ( 迭代器) Mediator (中 介者) Memento (备忘录) Observer (观察者) State (状态) Strategy (策略) Visitor (访 问者) 应用案例-MVC 什么是MVC Model/View/Controller 最早由IBM 的Smalltalk-80 开发环境产生。 应用案例-MVC MVC 通过建立一个订购/通知 协议来 分离视 图 和模型。一旦Model 的数据发生 变化, 将通 知有关View ,各个View 相应刷新。 这个设计可以说是Observer 模式 的具体 应用这个设计可以说是Observer 模式 的具体 应用 ,所谓Observer 模 式就是 将对象 分离, 使 得一个对象的改变能够影 响另一 些对象, 而这个对象并不需要知道 那些被 影响的 细 节。 应用案例-MVC 应用案例-MVC MVC 的另一个特点是View 可以嵌套,它通过CompositeView 类来实现,这也是Composite 设计模式的具体体现。 MVC 允许你不改变View 外观的情况下改变视图对用户输入的 响应方式。实现这些做法是将所有处理用户响应的操作封 装于Controller 类中,如果你需要改变用户的响应方式, 可以创新一个新的Controller 类,这个新类从Controller 派可以创新一个新的Controller 类,这个新类从Controller 派 生,这个新类的实例中定义你的响应策略。这是Strategy 设计模式的应用实例。 MVC 还使用了Factory Method 来指定一个View 的DEFAULT Controller ,应用Decorator 来增加视图的Scroll 等。 应用案例-MFC 类库 MFC Document/View 机制 MFC 的ON_UPDATE_COMMAND_UI 消 息机 制 应用案例-MFC 类库 MFC 的storing/retrieving 机制 应用案例-MFC 类库 应用案例:一个设计例子 VC/Samples/MFC/OLE/DrawCli DrawCli 的基础  MFC 提供的基础 Doc/View 结构 Doc 提供了强大的数据管理功能 View 提供了强大的显示功能 splitwnd 功能 CWinApp/CMainFrameCWinApp/CMainFrame 提供了一套命令处理流程 对OLE 的封装 Active Container OLE Clipboard Property Page 数据结构管理功能 CObject/CObList 我们的设计焦点 用C++ 对象来表示每一个图元 定义图元的公共接口 如何处理用户的操作 鼠标的动作鼠标的动作 图元对象的创建和管理 图元基类 class CDrawObj : public CObject { // Attributes CDrawDoc* m_pDocument; // owner virtual int GetHandleCount(); virtual CPoint GetHandle(int nHandle); virtual HCURSOR GetHandleCursor(int nHandle); virtual void SetLineColor(COLORREF color); virtual void SetFillColor(COLORREF color); // Operations// Operations virtual void Draw(CDC* pDC); virtual void DrawTracker(CDC* pDC, TrackerState state); virtual void MoveTo(const CRect& positon, CDrawView* pView = NULL); virtual int HitTest(CPoint point, CDrawView* pView, BOOL bSelected); virtual BOOL Intersects(const CRect& rect); virtual void MoveHandleTo(int nHandle, CPoint point, CDrawView* pView = NULL); virtual void OnOpen(CDrawView* pView); virtual void OnEditProperties(); virtual CDrawObj* Clone(CDrawDoc* pDoc = NULL); virtual void Remove(); virtual void Serialize(CArchive& ar); // …… }; 图元层次结构 CDrawObj CDrawRect CDrawPoly CDrawObj CDrawPoly CDrawOleOb j …… CDrawRect CDrawPoly CDrawOleObj …… 图元的创建 永久支持: CDocument::Serialize->CObList::Serialize ->CObject::Serialize CDrawObj::CloneCDrawObj::Clone DrawTool :创建图元对象 交互操作 键盘和菜单命令 MFC 内部机制 鼠标操作 在CDrawView 的鼠标处理函数中处理在CDrawView 的鼠标处理函数中处理 工具箱:工具链,有一个当前活动工具 转交给当前活动工具来处理 工具箱和CDrawTool class CDrawTool { // Constructors public: CDrawTool(DrawShape nDrawShape); // Overridables virtual void OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point); virtual void OnLButtonDblClk(CDrawView* pView, UINT nFlags, const CPoint& point); virtual void OnLButtonUp(CDrawView* pView, UINT nFlags, const CPoint& point);virtual void OnLButtonUp(CDrawView* pView, UINT nFlags, const CPoint& point); virtual void OnMouseMove(CDrawView* pView, UINT nFlags, const CPoint& point); virtual void OnEditProperties(CDrawView* pView); virtual void OnCancel(); // Attributes DrawShape m_drawShape; static CDrawTool* FindTool(DrawShape drawShape); static CPtrList c_tools; static DrawShape c_drawShape; // …… }; DrawTool 层次结构 CDrawTool CSelectTool CRectTool CDrawTool CRectTool CPolyTool …… CSelectTool CRectTool CPolyTool …… 例子中的模式  CDrawObj 和CDrawTool 合起来 构成了Factory Method 模式  CDrawTool::Clone 用到了 原型创 建模式  每一个CDrawTool 都是 一个singleton  Adapter 模式:把OLE 对象封装成CDrawObj Adapter 模式:把OLE 对象封装成CDrawObj  * 可以增加Composite 模式  facade 模式:通过CDrawDoc/View 与MFC 通 信  chain of responsibility :如鼠标处理工作  * 用Command 模式 增加undo/redo 功能 patterns  定义:  A physical arrangement of elements  Repeating;with some degree of correspondence in successive trials or observations  典范、范例,事物的标准 样式  In the book “Design Patterns”, the design patterns are descriptions of communicating objects and classes that are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context  Design patterns represent solutions to problems that arise when developing software within a particular context  几个近义词  idiom 、technique 、paradigm About patterns  About patterns  Documentation of expert software engineers' "behavior"  Documentation of specific reoccurring problems (and solutions)  Abstraction of common design occurrences  Properties of design patterns  A pattern addresses a recurring design problem that arises in specific design situations, and presents a solution to it. in specific design situations, and presents a solution to it.  Patterns document existing, well-proven design experience.  Patterns provide a common vocabulary and understanding for design principles.  Patterns are a means of documenting software architectures.  Patterns support the construction of software with define properties.  Patterns help you to manage software complexity. pattern 与framework  Patterns 支持软件结构和设计的重用  抓住了特定领域中问题的 成功解 决方案 中的静 态、动 态结构 和相互 之 间的协作关系  patterns 与开 发语言 无关, 但是建 立在一 定的环 境基础 上  例如:经典的MVC、Factory Method  frameworks 支持细节设计和代码的重用  framework 是一 组组件 的综合,这些 组件相 互协作,为一 族相关 应用 framework 是一 组组件 的综合,这些 组件相 互协作,为一 族相关 应用 提供了一个可重用的框架 结构  例如:MMC、MS Script Engine  两者结合起来, design patterns and frameworks 有助于提高 软件的质量  比如:重用性,扩展性, 性能, 可维护 性 Design pattern 与framework( 续)  a framework supplies the infrastructure and mechanisms that execute a policy for interaction between abstract components with open implementations.  frameworks are often said to abide by the Hollywood Principle ("Don't call us, we'll call you.") Principle ("Don't call us, we'll call you.")  比较:  Design patterns are more abstract than frameworks  Design patterns are smaller architectural elements than frameworks  Design patterns are less specialized than frameworks  framework 与class library(toolkit) Pattern 的研究情况  关于pattern 研究的历史 A Pattern Language ,Christopher Alexander ,1977 “Advanced C++ :Programming Styles and Idioms” , James Coplien ,1992 “Design Patterns: Elements of Reusable Object- Oriented Software” ,GOF,1995Oriented Software” ,GOF,1995 “Pattern-Oriented Software Architecture: A System of Patterns” ( 简称为“POSA”) ,GoV ,1996 …... Pattern is a hot topic  在amazon 上查找包含patterns 的书 (2002.12.12) Pattern 的研究现状  pattern 与Java  pattern 与CORBA  pattern 与系统结构 pattern  pattern 与generic programming 结合  其他(例如UML 等) POSA 中的模式分类  Architectural Patterns  表达了软件系统的基本结 构组织 形式或 者结构 方案  它包含一组预定义的子系 统,规 定了这 些子系 统的责 任,同 时还提供了用于组织和管 理这些 子系统 的规则 和向导  Design Patterns  为软件系统的子系统、组 件或者 组件之 间的关 系提供 一个精 炼之后的解决方案炼之后的解决方案  它描述了在特定环境下, 用于解 决通用 软件设 计问题 的组件 以及这些组件相互通信时 的可重 现结构  Idioms  是一个与编程语言相关的 低级模 式  它描述了如何实现组件的 某些功 能,或 者利用 编程语 言的特 性来实现组件内部要素之 间的通 信功能 POSA: Architectural Patterns(1)  Architectural Patterns are very high-level structural patterns.  Also called “Conceptual Patterns ”  From Mud to Structure: Organize components.  Layers : Organize components into layers where layer i's services are only used by layer i+1.  Pipes and Filters : Divide the task into several sequential  Pipes and Filters : Divide the task into several sequential processing steps -- the output of task i is the input of task i+1.  Blackboard : Several independent programs work cooperatively on a common data structure.  Distributed Systems :Handle distributed computation.  Broker : Introduce a broker component to to achieve better decoupling of clients and servers -- brokers accept requests from clients and forward the requests to servers, then return the results back to the clients. POSA: Architectural Patterns(2)  Interactive Systems: Keep a program's functional core independent of the user interface  Model - View - Controller : Divides the application into processing, output, and input. View and controller parts are usually observers of the model via the observer pattern  Presentation - Abstract - Control : Divides the application up to heirarchies or MVC-like components. Each component is dependent upon and provides functionality for the a higher- level component. There is only one top -level component level component. There is only one top -level component  Adaptable Systems : Design for change  Microkernel Encapsulate the fundamental services of the application  Reflection Divide the application into a meta-level and a base level to make the application "self-aware". The meta level encapsulates knowledge of the system; the base level encapsulates knowledge about the problem domain POSA: Design Patterns(1)  Structure Decomposition: Decompose subsystems and complex components into cooperating parts.  Whole - Part : Define a component that encapsulates smaller objects. Prevent clients from directly accessing the contained objects, but provide a interface for the aggregate.  Organization of Work : Components collaborate to solve complex problems.  Master - Slave The master divides a task among identical (but  Master - Slave The master divides a task among identical (but independent) slaves, the combines the slave's partial results to arrive a solution.  Access Control : Guard and control access to services and components.  Proxy : Clients communicate with a representative (proxy) rather than the target object itself. The proxy can perform pre- and post- processing to provide validation checking, access control, remote object access, extra computation, etc. See also Gamma et al's proxy pattern POSA: Design Patterns(2)  Management: Handle homogenous collections of objects, services and components in their entirety.  Command Processor : Extends Gamma et al's command pattern by adding an explicit command processor  View Handler : Separate the the management of views from the code required to present or control specific views. Similar to Gamma et al's Abstract Factory and Mediator.  Communication :Organize communication between  Communication :Organize communication between components.  Forward - Receiver : Contain all system-specific communication functionality in separate components so distributed peers can communicate without loosing portability  Client - Dispatcher - Server : A dispatcher acts as an intermediate layer between clients and servers. The dispatcher provides the communication channel and a name service to hide physical locations.  Publisher - Subscriber : Same as Gamma et al's Observer pattern. Idioms  Also called “Programming Patterns”  Idioms are low-level patterns specific to a programming language. Counted Pointer : Simplifies memory management of shared objects providing reference counting.  其他 Virtual constructor smart pointer handle/body 关于“Design Pattern”  对已有模式的整理、分类  一套描述模式的词汇,可用于交流和 文档化  为软件设计总结了宝贵的经验,这些 设计经 验 可以被重用,但不是简单的代码重用  分类: 分类: Creational Patterns Structural Patterns Behavioral Patterns  在软件设计模式领域,起到先驱的作 用 重提:指导模式设计的三个概念 重用(reuse) :是 目标 两种重要的重用手段 Inheritance & composition 接口与实现分离 接口保持不变,分离带来灵活性 多态性(polymorphism) Decouple 降低复杂性 如何描述一个模式  关键要素  Design pattern name ,Aliases or Also Known As  Problem ,Intent or Goal  Forces ,Constraints ,Motivation  Context , Applicability  Solution  Solution  Structure  Participants  Collaboration  Implementation  Evaluation ,Resulting Context ,Consequences  Related Patterns  Examples ,Known uses creational patterns Abstract Factory(kit) Builder Factory Method(virtual constructor) Prototype Singleton * Finder 模式 1:Factory Method ( 一)  Aliases :virtual constructor  Intent Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.  Motivation Frameworks use abstract classes to define and maintain relationships between objects. A framework is often responsible for creating these objects as well. Factory Method 模式(二) Applicability :Use the Factory Method pattern when a class can't anticipate the class of objects it must create. a class wants its subclasses to specify the a class wants its subclasses to specify the objects it creates. classes delegate responsibility to one of several helper subclasses, and you want to localize the knowledge of which helper subclass is the delegate. 插:virtual constructor  intent : 在一个类层次中,客户在runtime 要创 建一个 对象, 对 象的子类型未确定,根据 客户的 需要和 环境情 况,确 定对象的类型  problem : 只知道对象的一般类型, 不知道 确切类 型(需 要从环 境 中获取类型信息)  Forces : 隐藏对象的类型层次,只 发布基 接口 如何确定最合适的派生类 客户必须有办法使用派生 类的服 务 插:virtual constructor( 续)  solution : 使用Envelope/Letter 或者Handle/Body pattern 由envelope 或 者handle 根据 环境信 息选择 适当的 派生 类型  例子: 例子: 1 根据stream 动态创建对 象 2 COM 对象 Factory Method 模式(三)  struct  Participants  Product 、ConcreteProduct 、Creator 、ConcreteCreator  Collaborations Factory Method 模式(四)  Evaluation 多态性:客户代码可以做 到与特 定应用 无关, 适用于 任 何实体类 缺点:需要Creator 和相 应的子 类作为factory method 的 载体,如果应用模型确实 需要creator 和子类 存在, 则很 好;否则的话,需要增加 一个类 层次好;否则的话,需要增加 一个类 层次 优点: (1) Provides hooks for subclasses 。基类为factory method 提供缺省实现,子类可以重写新的实现,也可以 继承父类的实现。 体现了:加一层间接性,增加了灵活性 (2) Connects parallel class hierarchies Factory Method 模式(五) Connects parallel class hierarchies Factory Method 模式(六) Implementation (1) 父类是否提供缺省的实现 (2) factory method 的参数 (3) Language -specific variants and issues(3) Language -specific variants and issues SmallTalk , 使用类 型 C++ ,使用lazy initialization 技 术 (4) Using templates to avoid subclassing Factory Method 模式(七)  Related Patterns  Abstract factory  Prototype  Examples 模式 2 :Abstract Factory( 一)  Aliases :Kit  Intent Provide an interface for creating families of related or dependent objects without specifying their concrete classes.classes.  Motivation 为了解决一族相关或者相 依对象 的创建 工作, 专门定 义一个用于创建这些对象 的接口(基类)。 客户只 需与 这个基接口打交道,不必 考虑实 体类的 类型。 Abstract Factory( 二)  Applicability ,Use the Abstract Factory pattern when a system should be independent of how its products are created, composed, and represented. a system should be configured with one of multiple a system should be configured with one of multiple families of products. a family of related product objects is designed to be used together, and you need to enforce this constraint. you want to provide a class library of products, and you want to reveal just their interfaces, not their implementations. Abstract Factory( 三)  Struct  Participants :  Client 、AbstractFactory 、ConcreteFactory 、 AbstractProduct 、ConcreteProduct  Collaborations Abstract Factory( 四)  Evaluation 与factory method 的关系 多个factory method 合在一起 factory method 一定是virtual 的 Abstract Factory( 五)  Evaluation( 续) 优点: factory 把product 的类 型封装 起来, 分离了 具体的 类 易于变换product 族 保证不同族之间的product 相互 不会碰 撞,即 保证 products 的一致 性products 的一致 性 缺点: factory 对象的方法 数目对 应product 数目, 增加新 的 product 种类比较 困难, 要影响 到factory 的 基类, 进 而影响到所有的子类 Abstract Factory( 六)  Implementation Factories as singletons, 每个product 族往往 只需要 一 个factory 对象就可 以了 Creating the products, 对于product 族比较 多的情 况, 可以使用prototype 模 式来实 现这些factories ,而 不必可以使用prototype 模 式来实 现这些factories ,而 不必 对于每一个具有细微差别 的product 族都使用 一个 concrete factory class Defining extensible factories ,针对Evaluation 中提 到的 缺点,通过参数化技术提 高factory 的适 应能力 和扩展 性  问题在于,返回给客户什么样的类型? Abstract Factory( 七)  Related Patterns Factory Method 、Prototype 、Singleton  Examples WidgetFactory 插:COM 中的class factory  兼有两种模式:factory method 和abstract factory  IClassFactory 是abstract factory 的接口  CreateInstance 是factory method  对于每一个coclass ,class object 就是Concrete Factory ,  每一个产品的抽象接口为IUnknown ,COM 对象是 真正的 concrete productconcrete product  IPSFactoryBuffer 也是abstract factory 的接口  通过factory method 创建对象  比客户直接创建对象,要 灵活  ConcreteFactory 也是一 个concrete product ,所以可以重用 底 层的许多机制,如套间机 制、跨 进程机 制等 模式三:Builder ( 一)  Intent  Separate the construction of a complex object from its representation so that the same construction process can create different representations  Motivation  在复杂对象的构造过程中,允许 同样的 构造过 程能够 加入新 的被构造元素  “结构化构造过程”  Applicability, Use the Builder pattern when  the algorithm for creating a complex object should be independent of the parts that make up the object and how they're assembled.  the construction process must allow different representations for the object that's constructed. Builder ( 二)  Structure  Participants Director 、 Builder 、ConcreteBuilder 、 Product Builder ( 三) Collaborations Builder ( 四)  Evaluation It lets you vary a product's internal representation It isolates code for construction and representation It gives you finer control over the construction process  Implementation Implementation Builder interface(Assembly and construction) Why no abstract class for products? Empty methods as default in Builder.  Related patterns Abstract Factory 区别:(1) builder 重在构造过程,最后一步返回结果; (2) builder 构造许多复杂对象 Builder ( 五)  Examples readers 、parsers 、converters the persistence of OLE documents 模式四:Prototype( 一)  Intent Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.  Motivation  以一个已有的对象作为原 型,通 过它来 创建新 的对象。在增 加新的对象的时候,新对 象的细 节创建 工作由 自己来 负责,加新的对象的时候,新对 象的细 节创建 工作由 自己来 负责, 从而使新对象的创建过程 与框架 隔离开 来  Applicability  当产品的创建过程要独立 于系统 时  当产品的类型是在runtime 时 被指定 的情况 下  避免创建一个与product 层次 平行的factory 层次时 Prototype( 二)  Structure  Participants Prototype 、ConcretePrototype 、Client  Collaborations Prototype( 三)  Evaluation  Adding and removing products at run-time  Specifying new objects by varying values ,降低系统中类的 数目  Configuring an application with classes dynamically  要求:每一个product 类都必 须实现Clone 操 作  对于C++ 语言 特别有 意义:C++ 的class 不 是first -class objects 对于C++ 语言 特别有 意义:C++ 的class 不 是first -class objects  Implementation  Using a prototype manager  Implementing the Clone operation shallow copy versus deep copy Save & Load  Initializing clones  两阶段构造 Prototype( 四)  Related patterns  Prototype 与Abstract Factory 往往是相互竞争的  factory method  Examples  DrawCli ,music editor 模式五:Singleton( 一)  Intent Ensure a class only has one instance, and provide a global point of access to it.  Motivation It's important for some classes to have exactly one instance.instance. Instance-controlled class  Applicability, Use the Singleton pattern when there must be exactly one instance of a class, and it must be accessible to clients from a well-known access point. when the sole instance should be extensible by subclassing, and clients should be able to use an extended instance without modifying their code. Singleton( 二)  Structure  Participants Singleton  Collaborations Clients access a Singleton instance solely through Singleton's Instance operation. Singleton( 三)  Evaluation  Controlled access to sole instance  Reduced name space  Permits refinement of operations and representation, 允许子 类化  Permits a variable number of instances  More flexible than class operations (static member functions in  More flexible than class operations (static member functions in C++ )  这种思想比较适用于Object-Based 中的许 多情形  Implementation Ensuring a unique instance 考虑使用lazy initialize 使用global/static object 的缺点 Subclassing the Singleton class Singleton( 四)  Related patterns Singleton 与其 他创建 型模式 并不矛 盾,可 以用 singleton 来 实现其 他模式 中的对 象。包 括Abstract Factory 、Builder 、Prototype 等。 多个实例对于构造过程往往并无意义,所以 在许多 情况下singleton 模 式比较 符合应 用背景  Examples MFC 中的CWinApp 派生类 实例theApp …… 增加模式六:Finder( 一)  Intent  利用环境信息,根据客户 的请求,找到 已有的、符合 要求的 对象,返回给客户  Alias  Object-retriever  Motivation  在有些情况下,客户希望 连接到 一个对 象上,它提供 一些状 在有些情况下,客户希望 连接到 一个对 象上,它提供 一些状 态标识信息,由Finder 返 回已经 被创建 的对象,或者 重新创 建 新的对象(如果当前不 存在满 足条件 的对象)  Applicability, Use the Finder pattern when  当需要在软件不同部分之 间建立Client/Object 连 接时  把获取对象的过程隐藏起 来  view finder :The application demands user customizability of the actions taken when a particular file format is encountered in the browser. Finder( 二)  Structure client Finder GetObject table product productcreate Lookup  Participants  client 、finder 、product-table 、constructor 、product  Collaborations constructor product Finder( 三)  Evaluation  避免同样的对象被实例化 两次, 从而提 高资源 利用率,避免 发 生资源竞争  把连接对象的过程与客户 隔离开  带来的问题:多个客户共 享同样 的资源,如何 有效管 理对象 的 所有权?  Implementation  实现product table 以及相应的管理设施,保证查找 过程的 有效性  每一个product 的生命 周期管 理  如何标识product 的类 型,客 户如何 多态地 提供状 态标识 信息  Finder 对象本身可以是一 个singleton Finder( 四)  Related patterns 与Singleton 的 区别:singleton 是一 个类的 单个实 例; 而Finder 是避免 相同的 对象(通常是 类型和 状态信 息都 相同)被创建两次。 与Prototype 的区别 在创建product 子步骤中,需要 与其他 创建型 模式结 合 使用使用  Examples moniker in COM  在Netscape 浏览 器中, 根据MIME 类型,找到 插件, 然后创 建 view creational patters  Factory Method  本质:用一个virtual method 完成创建过程  Abstract Factory  一个product 族 的factory method 构成了一个factory 接口  Prototype  通过product 原 型来构 造product ,Clone+prototype  通过product 原 型来构 造product ,Clone+prototype manager  Builder  通过一个构造算法和builder 接口 把构造 过程与 客户隔 离开  Singleton  单实例类型,如何构造这 单个实 例?如 何访问 这单个 实例 ?  Finder  把对象的获取过程与客户 隔离开 creational patterns 小结  了解每一种模式的实质 具体实现的时候可能会有 变化情 况,或 者扩展,或者 退 化  factory method 是基础,abstract factory 是它的 扩展  factory method 、abstract factory 、prototype 都 涉及到类层次结构中对象的创建过程,有所 取舍 prototype 需要prototype manager factory method 需要依附 一个creator 类 abstract factory 需要一个平行的类层 次 根据应用的其他需求,以 及语言 提供的 便利来 决定使 用 哪种模式 creational patterns 小结(续)  builder 往往适合于特定的结构需要, 它所针 对 的product 比较复杂  singleton 有比较强烈的物理意义,可以用在 许 多细微的地方,不一定与类层次关联  finder 模式需要有一定范围内的对象管理 功能 finder 模式需要有一定范围内的对象管理 功能  这些patterns 都很常见,有时需要结合两种或 者多种模式完成系统中对象的构造过 程 Structural Patterns Adapter Bridge Composite * Decorator* Decorator Facade Flyweight * Proxy 模式 7: Adapter (一)  Aliases :Wrapper  Intent Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.interfaces.  Motivation Sometimes a toolkit class that's designed for reuse isn't reusable only because its interface doesn't match the domain-specific interface an application requires. Adapter 模式(二)  Applicability :Use the Adapter pattern when you want to use an existing class, and its interface does not match the one you need. you want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces.that don't necessarily have compatible interfaces. (object adapter only) you need to use several existing subclasses, but it's impractical to adapt their interface by subclassing every one. An object adapter can adapt the interface of its parent class. Adapter 模式(三)  Struct class adapter object adapter Adapter 模式(三)  Participants Client 、Target 、Adaptee 、Adapter  Collaborations class adapter —— delegation object adapter —— container Adapter 模式(四)  Evaluation 本质上是两种重用模型 class adapter : 无法adapt adaptee 的子类,但是可以重载adaptee 的行为 object adapter  adapt adaptee可以adapt adaptee 的所有子类 How much adapting does Adapter do? Pluggable adapters Using two-way adapters to provide transparency 针对class adapter ,用多重继承来实现 Adapter 模式(五) Implementation 使用C++ 继承机制实现class adapter 使用内嵌对象技术实现object adapter Pluggable adapters ,三种实现方案 使用抽象方法定义使用抽象方法定义 使用代理对象 参数化技术 这三种方法的实质:如何在一个类中定义抽象 操作,供客户插入?—— hook 技术 Adapter 模式(六)  Related Patterns  Bridge  Decorator  Proxy  Examples  DrawCli :COleDrawObj  C++ STL C++ STL  COM 中的site 模式 8:Bridge( 一)  Aliases :Handle/Body  Intent Decouple an abstraction from its implementation so that the two can vary independently  Motivation Motivation 要做到“抽象(接口)与实现 分离” ,最常 用的办 法是 定义一个抽象类,然后在 子类中 提供实 现。也 就是说 ,用继承机制达到“抽象(接口)与 实现分 离” 但是这种方法不够灵活, 继承机 制把实 现与抽 象部分 永久地绑定起来,要想独 立地修 改、扩 展、重 用抽象( 接口)与实现都非常困难。 Bridge 模式(二)  Applicability :Use the Bridge pattern when 编译时刻无法确定抽象(接口)与实 现之间 的关系 抽象部分与实现部分都可 以通过 子类化 而扩展 对一个实现的修改不影响 客户(无须重 新编译) 在C++ 中,对客户 完全隐 瞒实现 细节在C++ 中,对客户 完全隐 瞒实现 细节 因为扩展的原因,需要把 一个类 分成两 部分,(以便 灵 活组合) 在多个对象之间共享数据,但客 户不需 要知道 Bridge 模式(三)  Struct  Participants Client, Abstraction, RefinedAbstraction, Implementor, ConcreteImplementor  Collaborations Bridge 模式(四) Evaluation 抽象部分与实现部分的分离,可以在运行时刻连 接起来 二进制兼容性 提高可扩充性:抽象与实现两部分可以单独扩充提高可扩充性:抽象与实现两部分可以单独扩充 对客户隐藏实现细节 Bridge 模式(五) Implementation Only one Implementor Creating the right Implementor object 如何创建?根据客户环境,或者通过factory Sharing implementorsSharing implementors 资源管理:引用计数技术 Using multiple inheritance Bridge 模式(六)  Related Patterns  Abstract Factory 可以用来创建和配置Bridge 模 式  与Adapter 模式的区别  Examples  handle :文件handle 、窗 口handle 插:Handle/Body class StringRep { friend class String; StringRep(const char *s); ~StringRep(); int count; char *rep; }; class String { public: String();Counted Handle/Body String(); String(const String &s); String &operator=(const String &s); ~String(); String(const char *s); . . . . private: StringRep *rep; }; Counted Handle/Body 模式 9:Composite( 一)  Intent  Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.  Motivation  一些部件对象经过组合构 成的复 合部件 对象仍 然具有 单个部 件对 象的接口,这样的复合部 件对象 被称为“容器(container)”  复合部件与单个部件具有 同样的 接口, 所有接 口包含 两部分:单 个部件的功能、管理子部 件的功 能  递归组合 Composite 模式(二)  Applicability :Use the Composite pattern when you want to represent part-whole hierarchies of objects. you want clients to be able to ignore the you want clients to be able to ignore the difference between compositions of objects and individual objects. Clients will treat all objects in the composite structure uniformly. Composite 模式(三)  Struct  Participants Client, Component, Leaf, Composite  Collaborations 典型的composite 对象结构 Composite 模式(四) Evaluation defines class hierarchies consisting of primitive objects and composite objects 。定 义了包含leaf 对象 和composite 对象 的类层 次接口。— —递归结构 makes the client simple 。客户一致地处理复合对makes the client simple 。客户一致地处理复合对 象和单个对象 makes it easier to add new kinds of components 。易于增加新类型的 组件 can make your design overly general 。使 得系统 过于 一般化,无法限制类型的 组合, 可以在 运行时 刻通过 类型检查加以弥补 Composite 模式(五)  Implementation Explicit parent references Sharing components Maximizing the Component interface Declaring the child management operations Should Component implement a list of Components? Child ordering Caching to improve performance Who should delete components? What's the best data structure for storing components? Composite 模式(六)  Related Patterns  Decorator 、Flyweight 、Iterator 、Visitor  Examples  广泛应用于OO 领 域  MFC 中的CWnd  组件层次:ActiveX Container 模式 10 :Facade( 一)  Intent Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.  Motivation  使系统的各子系统之间的 关联最 小,引 入一个facade 对象, 为子 系统提供一个简单的、泛 化的设 施系统提供一个简单的、泛 化的设 施 Facade 模式(二) Applicability :Use the Facade pattern when 为一个复杂的子系统提供一个简单接口时。 子系统往往会非常复杂,但是其接口应该尽可 能地简单,特别是对于一般用户而言能地简单,特别是对于一般用户而言 客户与抽象类的实现部分之间必然存在一定的 依赖性,facade 可以降低这种依赖性 在多个子系统的结构中,使用facade 模式定义 子系统的入口点,有助于降低各子系统之间的 依赖性 Facade 模式(三)  Struct  Participants facade, subsystem classes  Collaborations Facade 模式(四) Evaluation 简化子系统的接口,方便客户使用子系统 化“紧耦合”为“松耦合” —— 实现组件软件的关键技术 facade 模式并不限制客户直接访问子系统的 内部类和对象内部类和对象 Implementation 以抽象类的形式定义facade ,进 一步decouple , 从而 完全隔离子系统的细节 Public versus private subsystem classes Facade 模式(五)  Related Patterns  facade 对象的创建:singleton 、abstract factory  Examples Netscape Browser Map Plugin Module MDI Framework Fake MFC library CDrawView CDrawDoc Map Plugin Module Map Module MFC library CDrawView CDrawDoc Map Module 模式 11 :FlyWeight( 一)  Intent Use sharing to support large numbers of fine-grained objects efficiently.  Motivation 当对象的粒度太小的时候,大量 对象将 会产生 巨大的 资 源消耗,因此考虑用共享 对象(flyweight) 来 实现逻 辑上源消耗,因此考虑用共享 对象(flyweight) 来 实现逻 辑上 的大量对象。Flyweight 对象可 用于不 同的context 中,本 身固有的状态不随context 发生变化, 而其他 的状态 随 context 而变化 FlyWeight 模式(二)  Applicability :Use the FlyWeight pattern when all of the following are true : An application uses a large number of objects. Storage costs are high because of the sheer quantity of objects. Most object state can be made extrinsic. Many groups of objects may be replaced by relatively few shared objects once extrinsic state is removed. The application doesn't depend on object identity. Since flyweight objects may be shared, identity tests will return true for conceptually distinct objects. FlyWeight 模式(三)  Struct FlyWeight 模式(四)  Struct( 续)  Participants client, flyweight, concreteFlyweight, FlyweightFactory, UnsharedConcreteFlyweight  Collaborations FlyWeight 模式(五) Evaluation 把对象的状态分开:intrinsic and extrinsic 节约存储空间:内部状态 的共享 节约了 大量空 间,外 部状态可通过计算获得从 而进一 步节约 空间 flyweight 与composite 结合。Flyweight 为leaf 节 点,并 且父节点只能作为外部状 态 Implementation Removing extrinsic state ,尽可能做到实时计 算(通 过 一个小的数据结构) Managing shared objects ,客户不能直 接实例 化 flyweight , 必须通 过管理 器,例 如FlyweightFactory 。 flyweight 的 生命周 期管理,引用 计数和 回收 FlyWeight 模式(六)  Related Patterns  与Composite 模式组合  可以用flyweight 实现State 和Strategy 模式中 的对象  Examples  Excel 中cell 的管理  IOleItemContainer 接口允许客户发现每一个cell 对象  用flyweight 实现cell 对象 —— tearoff 技术  对状态的有效管理是对象技术的一个进步 对状态的有效管理是对象技术的一个进步  “Design Patterns” 中提到的文档 编辑器 的例子 Structural Patterns :Decorator Structural Patterns :Proxy Structural patterns 小结 Adapter 、bridge 、facade adapter 用于 两个不 兼容接 口之间 的转接 bridge 用于将 一个抽 象与多 个可能 的实现 连接起 来 facade 用于 为复杂 的子系 统定义 一个新 的简单 易用的 接口 composite 、decorator 和proxycomposite 、decorator 和proxy composite 用于 构造对 象组合 结构 decorator 用于为 对象增 加新的 职责 proxy 为目标对象提供 一个替 代者 flyweight 针对细粒度对象的一种全 局控制 手段 Behavioral Patterns  Chain of Responsibility *  Command  Interpreter *  Iterator  Mediator *  Memento * Memento *  Observer  State *  Strategy  Template Method *  Visitor 模式 12 :Command( 一)  Aliases Action, Transaction functor (function object)  Intent Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.log requests, and support undoable operations.  Motivation 把请求信息和请求执行过 程封装 起来 framework 往 往需要 把命令 请求与 处理请 求的对 象分开 ,command 模式可 以把调 用操作 的对象 与操作 的目标 对 象分开 允许通过多种途径调用同 一个请 求。——请求 的重用 Command 模式(二)  Applicability :Use the Command pattern when : parameterize objects by an action to perform ,代替 回 调 specify, queue, and execute requests at different timesspecify, queue, and execute requests at different times support undo support logging changes so that they can be reapplied in case of a system crash structure a system around high-level operations built on primitives operations —— transactions Command 模式(三)  Struct  Participants Client, Command 、ConcreteCommand 、Invoker 、 Receiver Command 模式(四)  Collaborations Command 模式(五)  Evaluation  Command decouples the object that invokes the operation from the one that knows how to perform it.  Commands are first-class objects. They can be manipulated and extended like any other object.  You can assemble commands into a composite command. An example is MacroCommand.  It's easy to add new Commands, because you don't have to  It's easy to add new Commands, because you don't have to change existing classes.  Implementation  How intelligent should a command be?  Supporting undo and redo  Avoiding error accumulation in the undo process  Using C++ templates Command 模式(六)  Related Patterns  Composite 模式可用来 实现command 组 合  为实现undo/redo ,可 以用其 他行为 模式来 管理状 态,如 memento 模式。Command 被 放到history list 之前,可以用 prototype 模式复制 自身  Examples 模式 13 :Iterator( 一)  Aliases :Cursor  Intent Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.  Motivation Motivation An aggregate object such as a list should give you a way to access its elements without exposing its internal structure. Separating the traversal mechanism from the List object lets us define iterators for different traversal policies without enumerating them in the List interface. Iterator 模式(二)  Applicability :Use the Iterator pattern when : to access an aggregate object's contents without exposing its internal representation. to support multiple traversals of aggregate objects.objects. to provide a uniform interface for traversing different aggregate structures (that is, to support polymorphic iteration). Iterator 模式(三)  Struct  Participants Iterator 、ConcreteIterator 、Aggregate 、 ConcreteAggregate  Collaborations Iterator 模式(四)  Evaluation It supports variations in the traversal of an aggregate Iterators simplify the Aggregate interface More than one traversal can be pending on an aggregate  Implementation Implementation 实现可以非常灵活 Who controls the iteration? external iterator versus internal iterator Who defines the traversal algorithm? Aggregate 本身定义算法 —— Cursor mode iterator 定义算法 —— iterator 如何访问数据 How robust is the iterator? Iterator 模式(五)  Implementation( 续) Additional Iterator operations. 基本操作:First, Next, IsDone, and CurrentItem Using polymorphic iterators —— iterator 资源释放 Iterators may have privileged access Iterators for composites —— 适合于internal iteratorIterators for composites —— 适合于internal iterator 或者cursor 方 式的iterator Null iterators Iterator 模式(六)  Related Patterns Composite :iterator 常被 用于composite 模 式的复 合结构 Polymorphic iterators rely on factory methods to instantiate the appropriate Iterator subclass.  Examples COM enumerator :connectable object 、…COM enumerator :connectable object 、… ADO/OLE DB C++ STL 在STL 中,iterator 是连接algorithm 和container 的桥梁 模式 14 :Observer( 一)  Aliases :Dependents, Publish-Subscribe  Intent Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically .  Motivation 把系统分成一些相互关联 的类或 者对象,如何 维护这 些 类的实例一致性? The key objects in this pattern are subject and observer One-to-many relationship A subject may have any number of dependent observers. All observers are notified whenever the subject undergoes a change in state. Observer 模式(二)  Applicability :Use the Observer pattern when : When an abstraction has two aspects, one dependent on the other. Encapsulating these aspects in separate objects lets you vary and reuse them independently. When a change to one object requires changing others, and you don't know how many objects need to others, and you don't know how many objects need to be changed. When an object should be able to notify other objects without making assumptions about who these objects are. In other words, you don't want these objects tightly coupled. Observer 模式(三)  Struct  Participants Subject 、ConcreteSubject 、Observer 、ConcreteObserver Observer 模式(四)  Collaborations Observer 模式(五)  Evaluation  Abstract coupling between Subject and Observer  Support for broadcast communication  Unexpected updates  Implementation  Mapping subjects to their observers.  Observing more than one subject Observing more than one subject  Who triggers the update? Client or subject ?  Making sure Subject state is self-consistent before notification  subject 向observer 传 递变化 信息  中间插入ChangeManager Observer 模式(六)  Related Patterns Mediator : 用Mediator 模式 封装复 杂的更 新语义  Examples COM property page COM+ Event Model , MVC 模式 15 :Strategy( 一)  Aliases :Policy  Intent Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.  Motivation Motivation 有些算法对于某些类是必 不可少 的,但 是不适 合于硬 编 进类中。客户可能需要算 法的多 种不同 实现, 允许增 加 新的算法实现或者改变现 有的算 法实现 我们可以把这样的算法封 装到单 独的类 中,称 为 strategy Strategy 模式(二)  Applicability :Use the Strategy pattern when : many related classes differ only in their behavior. you need different variants of an algorithm. an algorithm uses data that clients shouldn't an algorithm uses data that clients shouldn't know about. a class defines many behaviors, and these appear as multiple conditional statements in its operations. Strategy 模式(三)  Struct  Participants Strategy 、ConcreteStrategy 、Context  Collaborations  Strategy and Context interact to implement the chosen algorithm  A context forwards requests from its clients to its strategy Strategy 模式(四)  Evaluation Families of related algorithms An alternative to subclassing Strategies eliminate conditional statements Clients must be aware of different Strategies Communication overhead between Strategy and Context Increased number of objects  Implementation Defining the Strategy and Context interfaces Strategies as template parameters Making Strategy objects optional Strategy 模式(五)  Related Patterns flyweight : 考虑用flyweight 模式来 实现strategy 对 象  Examples ATL 中COM 对象的线 程模型 支持 模式 16 :Visitor( 一)  Intent Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.  Motivation Motivation 为了把一个操作作用于一 个对象 结构中,一种 做法是 把 这个操作分散到每一个节 点上。 导致系 统难以 理解、 维 护和修改 把这样的操作包装到一个 独立的 对象(visitor) 中 。然后 在 遍历过程中把此对象传递 给被访 问的元 素。 不用visitor 的compiler 例子 Operation Class TypeCheck GenerateCode PrettyPrint VariableRefNod e AssignmentNod e ...... 使用visitor 的compiler 例子 class Class operation VariableRefNode AssignmentNode TypeCheckVisitor VisitVariableRef VisitAssignment GenerateCodeVisitor VisitVariableRef VisitAssignment PrettyPrintVisitor VisitVariableRef VisitAssignment Visitor 模式(二) Applicability :Use the Visitor pattern when 一个对象结构包含许多对象类,我们想执行一 些依赖于具体类的操作 要对一个对象结构中的对象进行很多不同的并要对一个对象结构中的对象进行很多不同的并 且不相关的操作,又不想改变这些对象类 定义对象结构的类很少改变,但是经常要在此 结构上定义新的操作。改变对象结构类,需要 重定义所有visitor 的接口 Visitor 模式(三)  Struct Visitor 模式(四)  Participants Client 、Visitor 、ConcreteVisitor 、ObjectStructure 、 Element 、ConcreteElement  Collaborations client 先创建一个ConcreteVisitor , 然后遍 历ObjectStructure Visitor 模式(五)  Evaluation  Visitor makes adding new operations easy  A visitor gathers related operations and separates unrelated ones  Adding new ConcreteElement classes is hard.  即使不是类层次,visitor 也 可以实 施  状态累积 状态累积  visitor 要访问每个元素的状 态,所 以要打 破封装  Implementation double-dispatch ,Accept 实现 了double dispatch This is the key to the Visitor pattern: The operation that gets executed depends on both the type of Visitor and the type of Element it visits. Who is responsible for traversing the object structure? Visitor 模式(六)  Related Patterns Composite :visitor 常常被用于composite 模式 组成的 结 构中  Examples 编译器实现编译器实现 其他Behavioral Patterns  Chain of Responsibility  请求的处理过程,沿着链 传递,decouple 发送和 接收方  Interpreter  在类层次结构中,在特定 环境的“interpret” 过 程  Mediator  用一个mediator 来decouple 各同等单 元 用一个mediator 来decouple 各同等单 元  Memento  在对象之外保存对象的内 部状态  State  把一个对象的状态独立出 来,动 态可变 换状态 对象的 类型  Template Method  在基类中定义算法的骨架,把某 些细节 延迟到 子类中 Behavioral Patterns 小结  Strategy 、Iterator 、Mediator 、State 、 command 用一个对象来封装某些特 性,比 如变化、交互、状态 、行为、命令  Mediator 、Observer Mediator 、Observer Observer 建立起subject 和observer 之间 的松耦 合连接 mediator 把 约束限 制集中 起来,-〉中 心控制  command 、Chain of Responsibility 、 interpreter command 模 式侧重 于命令 的总体 管理 Chain of Responsibility 侧重 于命令 被正确 处理 interpreter 用于 复合结 构中操 作的执 行过程

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档

相关文档