430 likes | 576 Views
Chapter 11 设计模式. Contents : § 11.1 概述 § 11.2 设计模式的特点与应用 § 11.3 设计模式的方法. § 11.1 概述. 设计模式产生于建筑学和人类学 Christopher Alexander : “质量可以客观评价吗?” Alexander, C., Ishikawa, S., Silverstein, M., The Timeless Way of Building, New York: Oxford University Press,1979.
E N D
Chapter 11 设计模式 Contents: § 11.1 概述 § 11.2 设计模式的特点与应用 § 11.3 设计模式的方法
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • Christopher Alexander:“质量可以客观评价吗?” • Alexander, C., Ishikawa, S., Silverstein, M., The Timeless Way of Building, New York: Oxford University Press,1979. • Christopher Alexander把模式定义为“ 在某一个情景(Context)下的问题(Problem)解决方案(Solution)”。 • 每个模式, 通过一种让你可以无数次使用这一解决方案、而不必再次重复同样工作的方式,描述一个在我们的环境中重复出现的问题、并描述该问题解决方案的核心。
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • Alexander描述这些人类建筑上的成果。下面的表中给出了他的The Timeless Way of Building的摘录。这本书简洁的说明了模式的基本原理。
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 模式使人们遭遇到特定问题时大家惯用的应付方式。 • Alexander 说一个模式的说明应该包括四个项目: • 模式名称(Pattern Name):一个助记名、词汇(描述模式的问题、解决方案和效果)。便于交流和思考,找到恰当的模式名称也是设计模式编目的难点之一。 • 问题(Problem):描述了何时使用模式。 • 解决方案(Solution):描述了设计的组成成分,他们之间的相互关系及各自的职责和写作方式(抽象级别上的,针对一般设计问题)。 • 效果(Consequences):描述了模式应用的效果及使用模式应权衡的问题(时空、灵活性、扩充性、可移植性) 。
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 从建筑学转移到软件设计模式 • Developing software is hard • Developing reusable software is even harder • Question • 软件中是否有不断重复出现、可以用某种相同方式解决的问题? • 是否可能用“ 按照模式、首先识别出模式然后在模式的基础上创建特定的解决方案”的方法来设计软件? • GOF:四人团、四人帮。Gamma、Helm、Johnson、Vlissides • Gamma, E., Heml, R., Johnson, R., Vlissides, j., Design Patterns: Elements of Reusable Object-Oriented Software, Reading Mass.: Addison-Wesley.中文版:《设计模式: 可复用面向对象软件的基础》,李英军等译, 机械工业出版社, 2000 年。 • 它将设计模式的思想应用于软件设计。 • 它描述了收录和描述设计模式的一个结构。 • 它收录了23 个模式。 • 它在这些模式的基础上提出了面向对象策略及方法的原则。 • Proven solutions include patterns and frameworks
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 从建筑学转移到软件设计模式 • 设计模式的描述 • Patterns capture the static and dynamic structures and collaborations of successful solutions to problems that arise when building applications in a particular domain • 模式的基本要素
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 从建筑学转移到软件设计模式 • 设计模式的描述 • GOF之模式要素
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 从建筑学转移到软件设计模式 • 设计模式的描述 • 为什么要学习设计模式? • 复用解决方案:通过复用已经建立的设计,我为自己的问题找到了更高的起点并避免了绕弯路。我受益于学习别人的经验。我不必再为普通、重复的问题重新设计解决方案。 • 建立通用的术语:交流与协作都需要一个共同的词汇基础、一个对问题的共同观点。设计模式在项目的分析和设计阶段提供了一个通用的参考点。 • 更高的分析和设计的视角:在问题上、在设计和面向对象的过程中, 模式给你一个更高层次的视角。这样的视角将你从“ 过早处理细节” 的暴政中解放出来。
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 从建筑学转移到软件设计模式 • 设计模式的描述 • 为什么要学习设计模式? • 学习设计模式的其他优点 • 改善团队和个人学习 • 代码的可修改性得到改善 • 设计模式阐述了基本的面向对象原则 • 对改良策略的采用— 甚至在模式不出现的时候 • 针对接口编程。 • 优先使用对象组合, 而不是类继承。 • 找到并封装变化点。
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 从建筑学转移到软件设计模式 • 设计模式的描述 • 为什么要学习设计模式? • 学习设计模式的其他优点 • 改善团队和个人学习 • 代码的可修改性得到改善 • 设计模式阐述了基本的面向对象原则 • 对改良策略的采用— 甚至在模式不出现的时候 • 了解“ 庞大的继承体系” 的替代方案
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 从建筑学转移到软件设计模式 • 设计模式的描述 • 为什么要学习设计模式? • 学习设计模式的其他优点 • What are Design Patterns? • Recurring solutions to design problems you see over and over. • A set of rules describing how to accomplish certain tasks in the realm of software development. • Focus on reuse of recurring architectural design themes • Address a recurring design problem that arises in a specific context and presents a solution to it • Design patterns represent solutions to problems that arise when developing software within a particular context • – i.e., “Patterns == problem/solution pairs in a context” • Patterns capture the static and dynamic structure and collaboration among key participants in software designs • – They are particularly useful for articulating how and why to resolve non-functional forces • Patterns facilitate reuse of successful software architectures and designs
§ 11.1 概述 • 设计模式产生于建筑学和人类学 • 从建筑学转移到软件设计模式 • 设计模式的描述 • 为什么要学习设计模式? • 学习设计模式的其他优点 • What are Design Patterns? • Design Pattern Space • Creational patterns • – Deal with initializing and configuring classes and objects • Structural patterns • – Deal with decoupling interface and implementation of classes and objects • Behavioral patterns • – Deal with dynamic interactions among societies of classes and objects
Design Pattern Space • Abstract Factory :提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。 • Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter使得原本由于不兼容而不能一起工作的那些类可以一起工作。 • Bridge:将抽象部分与它的实现部分分离,使他们都可以独立地变化。 • Chain of Responsibility:为解除请求的发送者和接收者之间耦合而使多个对象都有机会处理这个请求。将这些对象连成一个链并沿着这条链传递该请求,直到一个对象处理它。 • Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志以及支持可取消的操作。 • Composite:动态的给一个对象添加一些额外的职责。 • Façade:为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易实现。
Design Pattern Space • Factory Method :定义一个用于创建对象的接口,让子类决定将那个类实例化。Factory Method使得一个类的实例化延迟到其子类。 • Flyweight:运用共享技术有效地支持大量细粒度的对象。 • Interpreter:给定一个语言,它定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。 • Iterator:提供一种方法顺序访问一个聚合对象中各元素,而又不需暴露该对象的内部表示。 • Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。 • Memonto:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。 • Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 • Prototype:用原型实例制定创建对象的种类,并且通过拷贝这个原型来创建新的对象。 • Proxy:为其他对象提供一个代理以控制对这个对象的访问。 • Singleton:保证一个类仅有一个实例并提供一个访问它的全局访问点。
Design Pattern Space • State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。 • Strategy:定义一系列算法,把他们一个个封装起来,并且使他们可相互替换。本模式使得算法的变化独立于使用他们的客户。 • Template Method:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 • Visitor:表示一个作用于某对象结构中的个元素的操作,它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。
§ 11.2 设计模式的特点与应用 • 软件设计模式的概念得益于Christopher Alexander的工作,他将模式语言( Pattern Language )成功应用于城市建筑领域,导致了软件领域内应用模式的讨论。 • Christopher Alexander说:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。 • 尽管Alexander所指的是城市建筑模式,但他的思想也同样适用于面向对象设计模式,只是在面向对象的解决方案里,我们用对象和接口代替了建筑中的墙壁和门窗。 • “建筑”和“软件”这两类问题的核心都在于提供相关问题的解决方案。 • “设计模式”就是:在特定环境(Context) 下﹐对特定问题(Problem)的惯用解决之道(Solution)。
紧耦合的类很难独立的被复用,因为他们是相互依赖的 松散耦合提高了一个类本身被复用的可能性,并且系统更易于学习、移植、修改和扩展 Someone has already solved your problems
§ 11.3 设计模式的方法 • 漫谈UML • 类图 • 类和层次的关系 • 类名称 • 字段名称 • 方法名称 • abstract类 • abstract方法 • static字段 • static方法 • 类的继承关系 • 箭头方向的问题
§ 11.3 设计模式的方法 • 漫谈UML • 类图 • 类和层次的关系 • 接口与实现 • 接口的名称为斜体 • 虚线表示实现关系
§ 11.3 设计模式的方法 • 漫谈UML • 类图 • 类和层次的关系 • 接口与实现 • 聚合aggregation • 白色菱形的直线代表聚合关系 • Means:把东西放在菱形容器上
§ 11.3 设计模式的方法 • 漫谈UML • 类图 • 类和层次的关系 • 接口与实现 • 聚合aggregation • 存取控制 • UML只要在方法或字段的名称前面加上符号,就可以表示存取控制 • +表示是public方法或字段 • - 表示是private方法或者字段 • #表示是protected方法或字段
§ 11.3 设计模式的方法 • 漫谈UML • 类图 • 类间的关联性 • 处理流程和对象间的协调 • 顺序图
§ 11.3 设计模式的方法 • Singleton • Name • The Singleton Pattern: your ticket to creating one-of-a kind objects, for which there is only one instance. • Singleton、单件、唯一的对象实例、孤子模式、单态 • 属于创建模式,对象的创建模式 • 意图 • Singleton模式的用途是“ensure a class has only one instance, and provide a global point of access to it(确保每个类只有一个实例,并提供它的全局访问点)”。 • 应该由类本身来负责只使用一个类实例,而不是由类用户来负责。应该始终不要让类用户来监视和控制运行的类实例的数量。 • How To Do? • 能确保只有一个类的实例的时候的Pattern就称为:Singleton Pattern • 适用性 • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 • 结构 • See Example
Singleton • 参与者 • Singleton • 定义一个Instance操作,允许客户访问它的唯一实例。 • Instance是一个类操作。 • 负责创建它自己的唯一实例。 • 效果 • 对唯一实例的受控访问 • 允许可变数目的实例 • 实现 • See Example
Singleton • 类图 • 代码 • Main .java • Singleton .java • 设限的理由 • 如果有一个以上的对象存在,对象之间彼此影响,可能会出现Bug • 保证只有一个实例的存在,程序员就可以在这个前提下放心的编写程序 • 回顾 • Singleton Pattern保证了只有一个对象存在。 • 编写static 方法以取得对象的实例 • 构造函数设置成private 保证了构造函数不会被从Singleton类外调用构造函数
§ 11.3 设计模式的方法 • Adapter • Name • 适配器,别名:Wrapper • 属于结构模式 • 动机 • 为复用而设计的类不能够被复用的原因仅仅是因为接口与专业应用领域所需要的接口不匹配 • 适用性 • 你想使用一个已经存在的类,而它的接口不符合你的要求 • 结构、效果、参与者:See Example
Adapter(适配器) • 适配器的功能是介入既有内容和需要结果之间,作为沟通的桥梁。 • AC Adapter • 换个包装再度利用 • 具有填平“既有内容”和“需要结果”两者间“落差”的Design Pattern就是 • Adapter Pattern • Adapter Pattern 又称为Wrapper Pattern • Adapter Pattern有下列两种 • 类的 Adapter Pattern(继承) • 对象的 Adapter Pattern(委托) • Adapter:将一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Adapter(适配器) • Example: • (类的Adapter Pattern) • 把字符串输出成(Hello)(放在小括弧内)或者*Hello*(放在*内)
Adapter(适配器) • 负责适配器功能的是PrintBanner类 • 继承既有的Banner类 • 实现需要的print接口
Adapter(适配器) • Source • Banner类 Banner.java • Print接口 Print.java • PrintBanner类 PrintBanner.java • Main类 Main.java
Adapter(适配器) • 点评 • Main.java中将PrintBanner的对象实例指定到了Print接口类型的变量. • Main在利用Print这个接口来写程序 • 从Main的代码中完全看不出有Banner类的存在 • 我们完全可以不需要修改Main类就可以修改Banner类 • Main类并不知道系统会以什么样的方式执行PrintBanner类,换个说法,这个不知道也就是不需要修改Main类就可以直接修改PrinBanner类了.
Adapter(适配器) • Example(对象的Adapter Pattern) • 第一个例子中是:利用“继承”让“既有内容”符合“需要结果” • 利用”委托“:Java语言中委托就是指把某个方法的实际处理交给其他对象的方法进行。
Adapter(适配器) • Example(对象的Adapter Pattern) • Java中只允许单继承,如何Adapter? • Print.java • Banner.java • PrintBanner.java • Main.java
Adapter(适配器) • 启发 • 为何要用? • 什么时候用Adapter?
§ 11.3 设计模式的方法 • Template Method • 类行为型模式 • 何谓模板?(Template) • Template Method Pattern是什么? • 模板方法 • 意图:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 • 动机:模板方法使用抽象操作定义算法的先后顺序,而子类将重新定义这些操作以提供具体的行为。 • 适用性: • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现 • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复 • 控制子类扩展
Template Method Pattern • 效果 • 模板方法是一种代码复用的基本技术,在类库中尤为重要。 • 模板方法导致一种反向的控制结构,“别找我们,我们找你”(指的是一个父类调用一个子类的操作,而不是相反) • 结构、参与者、代码示例:See Example
Template Method Pattern • Example • AbstractDisplay.java • CharDisplay.java • StringDisplay.java • Main.java
Template Method Pattern • 启发 • 逻辑可共享 • Template Method Pattern究竟有什么好处?因为父类的模板已经实现了算法,所以子类就不需要重新逐一实现算法。 • 如果不采用Template Method Pattern会如何? • 逐一修改所有的Concrete Class ,麻烦 • 子类应视同父类 • 向上转型
Template Method Pattern • 启发 • 父类对子类的要求 • Subclass responsibility • 抽象类的意义 • 父类和子类之间的协调 • 思考题 • 1、display 的方法前为何要加上final ? • 2、Template Method Pattern中我们可否用接口替代 AbstractClass?
Design Pattern • GOF 23 Pattern • 简单的 • 复杂的 • 易理解的 • 不易理解的 • 共性 • 抽象 • 接口 • 继承 • 委托 • 解耦 • 复用
结论 • 设计模式将带来什么? • 一套通用的设计词汇 • 书写文档和学习的辅助手段 • 现有方法的一种补充 • 重构目标
习题 • 选取你所熟悉的三个设计模式,详细谈谈它们的意图、设计动机和适用性 • 什么是IoC(Inversion of Control)、 DIP(Dependency Inversion Principle)、Dependency Injection模式 ?举例说明?