当前位置:文档之家› 第8章 设计模式及其应用

第8章 设计模式及其应用

第八章 设计模式及其应用
本章目的:
了解设计模式的概念 掌握设计模式的三大分类 掌握常用的几种设计模式 了解各设计模式的优点、不足
掌握设计模式的使用原则及策略
Page 2
设计模式概述

每一个模式描述了一个在我们周围不断重复发生的问题, 以及该问题的解决方案的核心。 设计模式描述了软件设计过程中某一类常见问题的一般性 的解决方案。 面向对象设计模式描述了面向对象设计过程中、特定场景 下、类与相互通信的对象之间常见的组织关系。
Page 27
某系统需要实现对重要数据(如用户密码)的加密处理,在数据操作类
(DataOperator)中需要调用加密类中定义的加密算法,系统提供了两个不
同 的 加 密 类 , CipherA 和 CipherB , 它 们 实 现 不 同 的 加 密 方 法 , 在 DataOperator中可以选择其中的一个实现加密操作。如图所示:
由于《设计模式:可复用面向对象软件的基础》一书确定 了设计模式的地位,人们通常所说的设计模式隐含地表示 “面向对象设计模式”。但这并不意味“设计模式”就等 于“面向对象设计模式”,也不意味着GoF 23种模式就表 示了所有的“面向对象设计模式”。除了“面向对象设计 模式”外,还有其他设计模式。除了GoF23种设计模式外, 还有更多的面向对象设计模式。
Page 29
里氏代换原则
里氏代换原则实例
实例解析
Page 30
依赖倒转原则
依赖倒转原则定义
依赖倒转原则(Dependence Inversion Principle, DIP) 的定义如下: 高层模块不应该依赖低层模块,它们都应该依赖抽象。 抽象不应该依赖于细节,细节应该依赖于抽象。 另一种表述为: 要针对接口编程,不要针对实现编程。
Page 25
里氏代换原则
里氏代换原则分析
喜欢动物喜欢猫 因为猫是动物
Page 26
里氏代换原则
里氏代换原则实例
实例说明
某系统需要实现对重要数据(如用户密码)的加密处
理,在数据操作类(DataOperator)中需要调用加密类 中定义的加密算法,系统提供了两个不同的加密类, CipherA和CipherB,它们实现不同的加密方法,在 DataOperator中可以选择其中的一个实现加密操作。 如图所示:
单一职责原则
单一职责原则分析
一个类(或者大到模块,小到方法)承担的职责越多,它 被复用的可能性越小。而且如果一个类承担的职责过多, 就相当于将这些职责耦合在一起,当其中一个职责变化时, 可能会影响其他职责的运作。 类的职责主要包括两个方面:数据职责和行为职责,数据 职责通过其属性来体现,而行为职责通过其方法来体现。
使用多个专门的接口来取代一个统一的接口。
★★☆☆☆
合成复用原则 (Composite Reuse Principle, CRP)
迪米特法则 (Law of Demeter, LoD)
在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚 至不使用继承关系。
一个软件实体对其他实体的引用越少越好,或者说如果两个类 不必彼此直接通信,那么这两个类就不应当发生直接的相 互作用,而是通过引入一个第三者发生间接交互。
Page 8
重新认识面向对象


对象是什么? 从概念层面讲,对象是某种拥有责任的抽象。 从规格层面讲,对象是一系列可以被其他对象使 用的公共接口。 从语言实现层面来看,对象封装了代码和数据。 有了这些认识之后,怎样才能设计“好的面向对象”? 遵循一定的面向对象设计原则 熟悉一些典型的面向对象设计模式


Page 3
GoF 23 种设计模式

历史性著作《设计模式:可复用面向对象软件的基础》一 书中描述了23种经典面向对象设计模式,创立了模式在软 件设计中的地位。该书四位作者被人们并称为Gang of Four (GoF),“四人组”,该书描述的23种经典设计模 式又被人们称为GoF23种设计模式。

Page 4
Page 5
设计模式与面向对象



面向对象设计模式是“好的面向对象设计”,所谓“好的 面向对象设计”是那些可以满足“应对变化,提高复用” 的设计。 面向对象设计模式描述的是软件设计,因此它是独立于编 程语言的,但是面向对象设计模式的最终实现仍然要使用 面向对象编程语言来表达。 面向对象设计模式不像算法技巧,可以照搬照用,它是建 立在对“面向对象”纯熟、深入的理解的基础上的经验性 认识。掌握面向对象设计模式的前提是首先掌握“面向对 象”!
单一职责原则是实现高内聚、低耦合的指导方针,在很多 代码重构手法中都能找到它的存在,它是最简单但又最难 运用的原则,需要设计人员发现类的不同职责并将其分离, 而发现类的多重职责需要设计人员具有较强的分析设计能 力和相关重构经验。
Page 15
单一职责原则
单一职责原则实例
实例说明
某基于Java的C/S系统的“登录功能”通过如下登录类(Login) 实现:
Page 23
里氏代换原则
里氏代换原则分析
里氏代换原则由2008年图灵奖得主、美国第一位计算机
科学女博士、麻省理工学院Barbara Liskov教授和卡内
基-梅隆大学Jeannette Wing教授于1994年提出。
芭芭拉· 利斯科夫(Barbara Liskov),美国 计算机科学家,2008年图灵奖(计算机领 域的诺贝尔奖)得主,2004年约翰· 冯诺依 曼奖得主。美国工程院院士,美国艺术与科 学院院士,美国计算机协会会士。现任麻省 理工学院电子电气与计算机科学系教授。她 是美国第一个计算机科学女博士,第二位获 得图灵奖的女科学家。
★★★★☆
★★★☆☆
Page 13
单一职责原则
单一职责原则定义
单一职责原则(Single Responsibility Principle, SRP) 定义如下: 在软件系统中,一个类只负责一个功能领域中的相 应职责。 另一种定义方式如下: 就一个类而言,应该仅有一个引起它变化的原因。
Page 14
Page 9
面向对象设计原则
面向对象设计原则概述
单一职责原则
开闭原则
里氏代换原则
依赖倒转原则
接口隔离原则
合成复用原则
迪米特法则
Page 10
面向对象设计原则概述


软件的复用(Reuse)或重用拥有众多优点,如可以提高软 件的开发效率,提高软件质量,节约开发成本,恰当的复 用还可以改善系统的可维护性。 面向对象设计复用的目标在于实现支持可维护性的复用。 在面向对象的设计里面,可维护性复用都是以面向对象设 计原则为基础的,这些设计原则首先都是复用的原则,遵 循这些设计原则可以有效地提高系统的复用性,同时提高 系统的可维护性。
Page 6
从编程语言直观了解面向对象


各种面向对象编程语言相互有别,但都能看到它们对面向 对象三大机制的支持,即: “封装、继承、多态” 封装,隐藏内部实现 继承,复用现有代码 多态,改写对象行为 使用面向对象编程语言(如java/C#),可以推动程序员 以面向对象的思维来思考软件设计结构,从而强化面向对 象的编程范式。
Page 11
面向对象设计原则概述


面向对象设计原则和设计模式也是对系统进行合理重构 的指南针. 重构(Refactoring)是在不改变软件现有功能的基础上, 通过调整程序代码改善软件的质量、性能,使其程序的 设计模式和架构更趋合理,提高软件的扩展性和维护性。
Martin Fowler
Page 12
现使用单一职责原则对其进行重构。
Page 16
使用单一职责原则重构后的类图:
Page 17
开闭原则
开闭原则定义
开闭原则(Open-Closed Principle, OCP)定义如下:
一个软件实体应当对扩展开放,对修改关闭。也就
是说在设计一个模块的时候,应当使这个模块可以 在不被修改的前提下被扩展,即实现在不修改源代
绝大部分的设计模式都符合开闭原则,在对每一个模式
进行优缺点评价时都会以开闭原则作为一个重要的评价 依据,以判断基于该模式设计的系统是否具备良好的灵
活性和可扩展性。
Page 20
开闭原则
开闭原则实例
实例说明
某图形界面系统提供了各种不同形状的按钮,客户端代码可针对这些 按钮进行编程,用户可能会改变需求要求使用不同的按钮,原始设计 方案如图所示:
码的情况下改变这个模块的行为。
Page 18
开闭原则
开闭原则分析
开闭原则由Bertrand Meyer于1988年提出,它是面向对象设
计中最重要的原则之一。 在开闭原则的定义中,软件实体可以指一个软件模块、一个
由多个类组成的局部结构或一个独立的类。
Page 19
开闭原则
开闭原则分析
抽象化是开闭原则的关键。
设计原则简介
类的职责要单一,不能将太多的职责放在一个类中。 软件实体对扩展是开放的,但对修改是关闭的,即在不修改一 个软件实体的基础上去扩展其功能。 在软件系统中,一个可以接受基类对象的地方必然可以接受一 个子类对象。 要针对抽象层编程,而不要针对具体类编程。
重要性
★★★★☆ ★★★★★ ★★★★☆ ★★★★★
面向对象设计原则概述
面向对象设计原则简介
常用的面向对象设计原则包括七个,这些原则并不是
孤立存在的,它们相互依赖,相互补充。
设计原则名称
单一职责原则 (Single Responsibility Principle, SRP) 开闭原则 (Open-Closed Principle, OCP) 里氏代换原则 (Liskov Substitution Principle, LSP) 依赖倒转原则 (Dependency Inversion Principle, DIP) 接口隔离原则 (Interface Segregation Principle, ISP)
相关主题