1 / 87

第 3 章 概要设计 ( 第 3.4-3.6 节)

第 3 章 概要设计 ( 第 3.4-3.6 节). 主要内容. 面向对象设计方法 面向对象软件设计模式 MVC 框架. 3.4 面向对象的设计方法. 一个经过良好设计的对象是软件基本的建造块,因为它对真实世界中实体的所有特征都进行了建模,但隐蔽了它的数据和对数据进行的操作的实现。 对象具有信息内聚性,这促进了复用。. 3.4.1 软件复用. 所谓软件复用是指软件开发过程中重复使用相同或相似软件元素的过程。

spiro
Download Presentation

第 3 章 概要设计 ( 第 3.4-3.6 节)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第3章 概要设计(第3.4-3.6节) 中南大学 信息科学与工程学院 任胜兵

  2. 主要内容 • 面向对象设计方法 • 面向对象软件设计模式 • MVC框架 中南大学 信息科学与工程学院 任胜兵

  3. 3.4 面向对象的设计方法 一个经过良好设计的对象是软件基本的建造块,因为它对真实世界中实体的所有特征都进行了建模,但隐蔽了它的数据和对数据进行的操作的实现。 对象具有信息内聚性,这促进了复用。 中南大学 信息科学与工程学院 任胜兵

  4. 3.4.1软件复用 • 所谓软件复用是指软件开发过程中重复使用相同或相似软件元素的过程。 • 随着面向对象技术和基于组件的技术越来越成熟,软件复用越来越被人们所认同,如应用框架、设计模式、CORBA(Common Object Request Broker Architecture)等。 中南大学 信息科学与工程学院 任胜兵

  5. 软件复用的目标 • 时间性 • 降低维护代价 • 可靠性 • 高效性 • 一致性 • 保护投资 使用者 开发者 中南大学 信息科学与工程学院 任胜兵

  6. 软件复用的对象 • 人员的复用 • 设计和功能规格说明的复用 • 设计模式的复用 • 源代码的复用 • 抽象模块的复用 中南大学 信息科学与工程学院 任胜兵

  7. 软件复用的阻力 • 管理方面 • 经济方面 • 软件部件的管理 • 增加的开发费用 • 法律方面 中南大学 信息科学与工程学院 任胜兵

  8. 软件复用对模块化结构的要求 • 类型可变 • 例程组合 • 实现可变 • 表示独立性 • 抽出共同的行为 中南大学 信息科学与工程学院 任胜兵

  9. 3.4.2 面向对象设计 • 面向对象分析的结果是得到一系列由系统分析员和用户共同确认的描述系统必须“做什么”的需求分析模型。 • 面向对象设计的主要目的则是将分析阶段得到的需求分析模型转化为“怎么做”的设计模型。 中南大学 信息科学与工程学院 任胜兵

  10. 子系统设计 • 子系统设计准则: • 子系统应该具有良好定义的接口; • 除“通信类”外,子系统的其它所有类都只能与子系统内部的类通信; • 子系统的数目应该尽可能少 ; • 子系统内部仍然可以进一步分解成更小的子系统以降低复杂性。 • 一般地说,每个子系统可以进一步划分为最常见的四个部件:问题域部件,人机交互部件、数据管理部件和系统交互部件。 中南大学 信息科学与工程学院 任胜兵

  11. 问题域部件的设计 • 有时候,面向对象需求分析的结果可以不加修改直接作为面向对象设计中的问题域部件的设计。 • 修改: • 将多重继承结构改为单重继承结构以便能够用只有单重继承的面向对象程序设计语言实现; • 又如修改分析的结果以复用实现库中已有的类; • 增加保存临时结果的属性以提高速度; • …. 中南大学 信息科学与工程学院 任胜兵

  12. 人机交互部件的设计 • 人机交互部件突出人如保命令系统以及系统如何向用户提供交互信息。 • 在设计人机交互部件时,首先考虑的是人,其次是任务,然后再是有关工具。 • 人机交互部件在系统行为和用户界面之间架起了一座桥梁。 中南大学 信息科学与工程学院 任胜兵

  13. 交互设计准则 • 一致性,即使用一致的术语,一致的步骤、一致的动作等; • 及时提供反馈信息;并且应简短、直接、及时从户角度作出提示; • 提供撤消命令; • 减少用户记忆负担,如每步给出足够的提示; • 易学,富有吸引力,如提供联机帮助,充分利用图形用户界面的优越性等。 中南大学 信息科学与工程学院 任胜兵

  14. 人机交互部件类的设计 • 人机交互的形式有多种多样,如对话、菜单、窗口、按钮、图符、表格、命令语言等等。 • 人机交互部件类的设计目的是决定使用哪种方式的人机交互,并标识有关的人机交互对象&类。 • 人机交互部件的设计在一定程度上依赖于所使用的用户接口。 中南大学 信息科学与工程学院 任胜兵

  15. 注意事项 • 不是改变用户行为去适应系统的人机交互界面,而是反之; • 一个好的用户界面总是能在工作中引导用户完成其工作,而不是强迫用户按某种特定方式工作。最好由用户开发的场景或使用用例来驱动用户界面。 中南大学 信息科学与工程学院 任胜兵

  16. 数据管理部件的设计 • 数据管理部件的对象&类用来对系统生成的永久数据进行访问和管理。 • 设置数据管理部件可以将特定的数据管理技术从问题域部分分离开来,有利开系统的维护。 中南大学 信息科学与工程学院 任胜兵

  17. 主要活动 • 选择数据存储管理模式:普通文件管理系统、关系数据库管理系统和面向对象数据库管理系统。 • 数据存放格式设计(一项重要的工作便是消除数据冗余)。 • 设计数据管理操作和属性。 中南大学 信息科学与工程学院 任胜兵

  18. 人机接口: 问题域: 数据管理: Salesman RentalTransaction SaleRentWindow AVItem AVItemDM 系统准备好 准备租用 显示租用状态 扫描条形码 激活租用事务 获取信息 获取信息 检索信息 返回信息 返回信息 返回信息 显示信息 确认租用 更新租用信息 更新信息 获取信息 更新信息 返回信息 返回信息 返回信息 显示信息 例子 中南大学 信息科学与工程学院 任胜兵

  19. 系统交互部件的设计 • 系统交互部件主要负责系统与系统中的物理设备之间、各个子系统之间、以及系统与其它系统之间的通信和数据交换。 • 系统交互部件的设计主要是标识一些对象&类,负责处理并发、中断、调度(操作系统级)以及其它有关特定平台的一些问题。 中南大学 信息科学与工程学院 任胜兵

  20. 任务睡眠 数据线或其它数据源中断 阅读数据 任务苏醒 处理数据 结束处理 事件驱动型交互 • 事件驱动型交互由事件触发(事件常是表明某些数据到达的信号),这些交互可能负责与设备、屏幕窗口、子系统或其它任务等通信。 中南大学 信息科学与工程学院 任胜兵

  21. 任务设置睡眠 时间后转入睡眠 系统中断 通知任务 任务苏醒 任务处理 结束处理 时钟驱动型交互 • 时钟驱动型交互按特定的时间间隔被触发过进行某些处理。这类交互要适用于某些人机接口、子系统、任务或其它系统周期性地通信。 中南大学 信息科学与工程学院 任胜兵

  22. 其他活动 • 识别优先交互和关键交互; • 识别交互协调者; • 审查各个交互; • 定义各交互。 中南大学 信息科学与工程学院 任胜兵

  23. 对象设计 根据面向对象分析阶段得到的对象模型(主要是问题域的对象模型),以及面向对象设计阶段特别是子系统设计中各个部件的设计中得到的对象模型,对这些对象模型进一步求精而得到每一个对象的更为准确的属性,然后设计出这些属性相应的数据结构。 有关对象设计的内容,实际上是详细设计的工作。 中南大学 信息科学与工程学院 任胜兵

  24. 消息设计 • 消息设计是指要描述每一个对象可以接收和发送的消息接口。 • 消息设计的一个很好的出发点是对象模型中的对象与对象之间的关系。 • 对象与对象的事件跟踪图也是消息设计的另一个出发点。 中南大学 信息科学与工程学院 任胜兵

  25. 方法设计 方法设计是指在面向对象设计阶段根据面向对象的行为模型和功能模型,进一步对每一个对象的方法进行求精,一方面是要将以前遗漏了的方法找出来,一方面是要定义每一种方法的过程化的细节。 详细设计将继续讨论 中南大学 信息科学与工程学院 任胜兵

  26. 3.5面向对象软件设计模式 • 面向对象设计模式最初出现于70年代末80年代初。1987年W.Cunningham和K. Beck引入建筑师C.Alexander的模式概念。 • 面向对象设计模式是普通面向对象设计问题的解决方案,这类问题以一组交互类的形式出现,用户根据需要定制这些交互类以形成专门的设计。 • 作用:设计模式不仅使人们可以更加方便地复用成功设计方案,也能提高已有系统的文档管理和系统维护的有效性。 中南大学 信息科学与工程学院 任胜兵

  27. 3.5.1设计模式的描述与分类 • 一个设计模式事实上是系统地命名、解释和评价某一重要的可重现的面向对象设计方案。所有设计均可从四个方面加以描述: • 模式名称:用一至两个词描述设计问题、解决方案和效果。模式名称便于使用者在更高的抽象层次上进行设计并交流有关设计思想。 • 问题描述:指明使得设计模式可以被应用所必须存在的环境条件。它解释了设计问题及其背景。 • 解决方案:描述了设计方案的组成部分,它们之间的关系及各自的职责和协作方式。 • 效果:描述应用设计模式后的结果及使用模式应权衡的问题。 中南大学 信息科学与工程学院 任胜兵

  28. 类别 设计模式名称 意图简要说明 创建型模式 抽象工厂(Abstract Factory) 提供创建相关的或相互依赖的一族对象的接口而无需指定具体的类。 生成器(Builder) 将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示。 工厂方法(Factory Method) 定义一个用于创建对象的接口,由子类决定实例化哪一个类。 原型(Prototype) 使用一个原型指定要创建的类的类型,通过拷贝这个原型得到新的对象。 单件(Singleton) 保证一类仅有一个实例,并提供一个全局性的访问点。 Gamma分类 中南大学 信息科学与工程学院 任胜兵

  29. 类别 结构型模式 适配器(Adapter) 设计模式名称 意图简要说明 将一个类的接口转换成用户希望得到的另一种接口,使原来由于接口不相容而不能一起工作的类可一起工作。 桥(Bridge) 将类的抽象部分与它的实现部分分离,使它们可以相互独立地变化。 组合(Composite) 将对象组成树结构来表示局部和整体的层次关系,使单个对象和组合对象的使用具有一致性。 装饰(Decorator) 动态地给一个对象添加新功能。 外观(Façade) 给一个子系统的所有接口提供一个统一接口,使子系统便于使用。 轻量(Flyweight) 运用共享技术有效地支持大量细粒度对象。 Gamma分类 中南大学 信息科学与工程学院 任胜兵

  30. 类别 行为模式 职责链(Chain of Responsibility) 设计模式名称 意图简要说明 将多个接收请求的对象连成一条链,并沿链传递请求,直到有一个对象处理它为止。避免了请求的发送者和接收者之间的耦合。 命令(Command) 将一个请求命令封闭优一个对象,便于将不同的请求参数化;对请求排对或记录请求日志,以及支持可撤消请求的操作。 解释器(Interpreter) 给定一种语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。 迭代器(Iterator) 提供一种顺序访问一个聚合对象中各元素又不暴露对象内部表示的方法。 中介者(Mediator) 定义一个中介对象封装一系列对象的交互。 备忘录(Memento) 在不破坏封装的条件下,获得一个对象的内部状态并将它外部化,从而在以后可使对象恢复到这个状态。 观察者(Observer) 定义对象一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象均得到通知并被自动更新。 状态(State) 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎能修改它的类。 策略(Strategy) 定义一系列算法,把它们均封闭起来,并且使它们可相互替换。它使算法可独立于使用者而变化。 模板方法(Template Method) 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,从而使子类可以不改变算法的结构即可重定义该算法的某些特定步骤。 访问者(Visitor) 描述一个作用于某对象结构中各元素的操作,从而可以在不改变被操作元素类的条件下定义新的操作。 Gamma分类 中南大学 信息科学与工程学院 任胜兵

  31. 3.5.2创建型模式 • 创建型模式帮助系统独立于对象的产生、组合和表示。 • 作用:一方面均将关于系统使用哪些具体的类的信息封装起来;另一方面隐蔽了这些具体类的实例是如何被创建和放在一起的。因此,创建型模式在“什么”被创建、“怎样”被创建、“谁”创建它以及“何时”创建等方面带来了很大的灵活性,有利于设计可复用的软件成分。 中南大学 信息科学与工程学院 任胜兵

  32. Client 《interface》 Product 《interface》 Creator factoryMethod( ) 《creates》 ConcreteProduct ConcreteCreator factoryMethod( ) 工厂方法模式(结构) 中南大学 信息科学与工程学院 任胜兵

  33. 产品/具体产品类 Product定义工厂方法生成的对象的接口。 例如: (Java程序) public interface Product { //产品的接口声明 } Concrete Product实现Product类的接口。例如:public class ConcreteProduct implements Product { // 构造函数 public ConcreteProduct( ) { // do something } //产品接口实现 } 中南大学 信息科学与工程学院 任胜兵

  34. 创建者/具体创建者类 Creator声明一个工厂,返回一个Product类型的对象。也可定义工厂方法的缺省实现。可调用工厂方法生成一个Product对象。例如: public interface Creator { //工厂方法接口声明 public Product factoryMethod(); } Concrete Creator重定义工厂方法以返回适当的Concrete Product实例。例如: public class ConcreteCreator implements Creator{ //工厂方法实现 public Product factoryMethod( ) { return new ConcreteProduct( ); } } 中南大学 信息科学与工程学院 任胜兵

  35. 客户类 Client仅使用由Creator和Product声明的接口。例如: public class Client { private static Creator creator; private static Product product; public static void main(String[] args) { creator = new ConcreteCreator(); product = creator.factoryMethod(); // do other things } } 中南大学 信息科学与工程学院 任胜兵

  36. 使用条件 • 一个类不知道它所必须创建的对象的类。 • 一个类希望由其子类确定它创建的对象。 • 类将创建对象的职责委派给多个帮助者子类中的一个,且希望将哪一个帮助者子类是代表者这一信息局部化。 依赖倒置原则 中南大学 信息科学与工程学院 任胜兵

  37. 《interface》 Figure Client 《interface》 Manipulator createManipulator( ) downClick( ) upClick( ) drag( ) LineFigure TextFigure TextManipulator LineManipulator createManipulator() createManipulator() downClick( ) upClick( ) drag( ) downClick( ) upClick( ) drag( ) 使用效果 • 比直接产生对象更灵活。“工厂方法”给子类一个挂钩,以便在子类中扩展。 • 连接平行类层次。当一个类将它的一些职责委托给一个独立的类的时候,就会产生平行类层次。 中南大学 信息科学与工程学院 任胜兵

  38. 结论 • 工厂方法模式在遵循依赖倒置原则方面有重要意义,使得高层策略模块在创建类的实例时无需依赖具体的类。也使得一组类的完全不同序列的实现间进行交换成为可能。 • 工厂方法模式会带来复杂性。 中南大学 信息科学与工程学院 任胜兵

  39. Client 《interface》 AbstractFactory 《interface》 AbstractProductA createProductA( ) createProductB( ) ConcreteProductA1 ConcreteProductA2 《interface》 AbstractProductB ConcreteFactory2 ConcreteFactory1 createProductA( ) createProductB( ) createProductA( ) createProductB( ) ConcreteProductB1 ConcreteProductB2 抽象工厂模式结构 中南大学 信息科学与工程学院 任胜兵

  40. 抽象工厂/具体工厂类 Abstract Factory声明创建抽象产品对象的操作接口。例如: public interface AbstractFactory { // 产品等级结构A的工厂方法 public AbstractProductA createProductA(); // 产品等级结构B的工厂方法 public AbstractProductB createProductB(); } ConcreteFactoryl实现创建具体产品对象的操作。例如: public class ConcreteFactory1 {//产品族1的具体工厂类 // 产品等级结构A的工厂方法 public AbstractProductA createProductA() { return new ConcreteProductA1( ); } // 产品等级结构B的工厂方法 public AbstractProductB createProductB() { return new ConcreteProductB1( ); } } //产品族2的具体工厂类的实现与产品族1的具体工厂类类似 中南大学 信息科学与工程学院 任胜兵

  41. 抽象产品/具体产品类 AbstractProductA声明一种产品对象的接口。例如: public interface AbstractProductA { //接口声明 } //AbstractProductB与AbstractProductA类似 ConcreteProductA1定义将被相应的具体工厂类创建的产品对象;实现抽象产品类接口。例如: public class ConcreteProductA1 implements AbstractProductA { //构造函数 public ConcreteProductA1( ){ } //接口实现 } //其它产品类的定义与ConcreteProductA1类似 中南大学 信息科学与工程学院 任胜兵

  42. 客户类 Client仅使用由抽象工厂类和抽象产品类声明的接口。例如: public class Client { private static AbstractFactory factory1; private static AbstractFactory factory2; private static AbstractProductA productA; private static AbstractProductB productB; public static void main(String[] args) { factory1 = new ConcreteFactory1( ); factory2 = new ConcreteFactory2( ); productA = factory1.createProductA( ); productB = factory2.createProductB( ); // do other things } } 中南大学 信息科学与工程学院 任胜兵

  43. 使用条件 • 系统应与如何创建、组合和表示其产品无关。 • 系统应由多个产品族之一来配置。 • 强调一系列相关产品对象的设计以便联合使用。 • 提供一个产品类库,但只想显示它们的接口。 中南大学 信息科学与工程学院 任胜兵

  44. 使用效果 • 隔离了具体的类。 • 使产品族间的转换容易进行。 • 容易实现一个应用一次只使用同一个系统中的产品对象。 • 难以扩展“抽象工厂”以支持新种类的产品。 不符合开闭原则 中南大学 信息科学与工程学院 任胜兵

  45. 3.5.3结构型模式 • 结构型模式涉及如何组合类和对象构成更大的结构。一种方法是采用继承机制来组合接口或实现来形成更大的结构;另一种方法通过对象组合方式对一些对象进行组合来形成。由于对象组合可以在运行时刻改变,而继承机制为静态类组合,因而对象组合方式具有更大的灵活性。 中南大学 信息科学与工程学院 任胜兵

  46. Client Client 《interface》 Target 《interface》 Target Adaptee Adaptee operation( ) request( ) operation( ) request( ) Adapter Adapter request( ) request( ) 适配器模式结构 利用继承机制 利用组合机制 中南大学 信息科学与工程学院 任胜兵

  47. 目标/被适配者类 Target定义客户类使用的与特定领域相关的接口。例如: public interface Target { //定义用户期望的接口 public void request( ); } Adaptee定义一个被用来适配的已存在的接口。例如: public class Adaptee { //被适配的接口 public void operation( ){ // do something } } 中南大学 信息科学与工程学院 任胜兵

  48. 适配器类(利用继承机制) Adapter适配Adaptee类中的接口至Target类中的接口。例如: //利用继承机制 public class Adapter extends Adaptee implements Target { //适配operation为request public void request( ) { //调用operation operation( ); } } 中南大学 信息科学与工程学院 任胜兵

  49. 适配器类(利用组合机制) // 利用对象组合 public class Adapter implements Target { private Adaptee adaptee; // 构造函数 public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } //适配operation为request public void request( ) { // do other things adaptee.operation( ); // do other things } } 中南大学 信息科学与工程学院 任胜兵

  50. 客户类 Client使用Target类中的接口。例如: // 利用继承机制 public class Client { private static Target target; public static void main(String[] args) { target = new Adapter( ); // 以后可通过调用target.request( )调用adaptee定义的operation( ) // do other things } } 中南大学 信息科学与工程学院 任胜兵

More Related