设计模式怎样解决设计问题

  设计模式采用多种方法解决面向对象设计者经常碰到的问题,这里给出几个问题以及使用设计模式解决他们的方法。

1.寻找合适的对象

  面向对象程序由对象组成,对象包括数据和对数据进行操作的过程,过程通常称为方法或操作,对象在收到客户的请求(或)消息后,执行相应的操作。

  客户请求是使对象执行操作的唯一方法,操作又是对象改变内部数据的唯一方法。由于这些限制,对象的内部状态是被封装的,它不能被直接访问,它的表示对于对象外部是不可见的。

  面向对象设计最困难的部分是将系统分解成对象集合。因为要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、演化、复用、扩展等等,它们都是影响着系统的分解,并且这些因素通常还是相互冲突的。

  面向对象设计方法学支持许多设计方法。你可以写出一个问题的描述,挑出名词和动词,进而创建相应的类和操作;或者,你可以关注系统的协作和指责关系;或者,你可以对现实世界建模,再将分析时发现的对象转化至设计中,至于哪一种方法最好,并无定论。

  设计的许多对象来源于现实世界的分析建模。但是,设计结果所得到的类通常在现实世界中并不存在,有些是像数组之类的低层类,而另一些层次较高。例如,Composite模式引入了统一对待现实世界中并不存在的对象的抽象方法。严格反映当前现实世界的模型并不能产生反映将来世界的系统。设计中的抽象对于生产灵活的设计是至关重要的。

  设计模式帮你确定并不明显的抽象和描述这些抽象的对象。例如,描述过程或算法的对象现实中并不存在,但他们却是设计的关键部分。Strategy模式描述了怎样实现可互换的算法族。State模式将实体的每一个状态描述为一个对象。这些对象在分析阶段,甚至在设计阶段的早期都并不存在,后来为使设计更灵活,复用性更好才将它们发掘出来。

2.决定对象的粒度

  对象在大小和数目上变化极大,它们能表示下至硬件或上至整个应用的任何事物。那么我们怎样决定一个对象应该使什么呢?

  设计模式很好的讲述了这个问题。 Facade模式描述了怎样用对象表示完整的子系统,Flyweight模式描述了如何支持大量最小粒度的对象。其他一些设计模式描述了将一个对象分解成许多小对象的特定方法。 Abstract Factory和Builder产生那些专门负责生成其他对象的对象。Visitor和Command生成的对象专门负责实现对其他对象或对象组的请求。

3.指定对象接口

  对象声明的每一个操作指定操作名,作为参数的对象和返回值,这就是所谓的操作的型构(signature) 。对象操作所定义的所有操作型构的集合被称为该对象的接口(interface)。对象接口描述了该对象所能接受的全部请求的集合,任何匹配对象接口中型构的请求都可以发送给该对象。

  类型(Type)是用来标识特定接口的一个名字。 如果一个对象接受 “window”接口所定义的所有操作请求,那么我们就说该对象具有“window”类型。一个对象可以有恀类型,并且不同的对象可以共享同一个类型。对象接口的某部分可以用某个类型来刻画,而其他部分可以用其他类型刻画。两个类型相同的对象只需要共享他们的部分接口。接口可以包含其他接口作为子集。当一个类型的接口包含另一个类型的接口时,我们就说他是另一个类型的子类型(subtype)另一个类型称之为它的超类型(supertype) 我们常说子类型继承了它的超类型的接口。

  在面向对象系统中,接口是基本的组成部分。对象只有通过它们的接口才能于外部交流,如果不通过对象的接口就无法知道对象的任何事情,也无法请求对象做任何事情。对象接口与其功能实现是分离的,不同对象可以对请求做不同的实现,也就是说,两个有相同接口的对象可以有完全不同的实现。

  当给对象发送该请求时,所引起的具体操作既与请求本身有感又与接受对象有关。支持相同请求的 不同对象可能对请求激发的操作又不同的实现。发送给对象的请求和它的相应操作在运行时刻的连接就称之为动态绑定(dynamic binding)。

  动态绑定是指发送的请求直到运行时刻才受你的具体实现的约束。因而,在知道任何有正确接口的对象都将接受此请求时,你可以写一个一般的程序,它期待着那些具有该特定接口的对象。进一步讲,动态绑定允许你在运行时刻彼此替换有相同接口的对象。这种可替换性就称为多态(polymorphism),它是面向对象系统中的核心概念之一。多态允许客户对像仅要求其他对象支持特定接口,除此之外对其假设几乎近于无。多态简化了客户的定义,使得对象间彼此独立,并可以在于运行时刻改变它们相互的关系。

  设计模式通过确定接口的主要组成成分及经接口发送的数据类型,来帮助你定义接口。设计模式也许还会告诉你接口中不应该包括哪些东西,Memento模式是一个很好的例子,它描述了怎样封装和保存对象内部的状态,以便一段时间后对象能够恢复到这一状态。它规定了Memento对象必须定义两个接口:一个允许客户保持和复制Memento的限制接口,和一个只有原对象才能使用的用来存储和提取memento中状态的特权接口。

  设计模式也制定了接口之间的关系,例如,Decorator和Proxy模式要求Decorator和Proxy对象的接口与被修饰的对象和受委托的对象一致,而Visitor模式中,Visitor接口必须反映出visitor能访问的对象的所有的类。

4.描述对象的实现

5.运用复用机制

6.关联运行时刻和编译时刻的结构

7.设计应支持变化

待续。

原文地址:https://www.cnblogs.com/planheaven/p/10693547.html

时间: 2024-10-13 14:02:29

设计模式怎样解决设计问题的相关文章

设计模式怎样解决设计问题[1] 寻找合适的对象

面向对象设计最困难的部分是将系统分解成对象集合.因为要考虑许多因素:封装.依赖关系.灵活性.性能.演化.复用等等,它们都影响着系统的分解,并且这些因素通常都是互相冲突的. 寻找合适的类是为了便于你设计出好用的类,包含了3种设计模式: Composite模式(组合模式),State模式(状态模式)以及Strategy模式(策略模式) Composite模式(组合模式) http://www.cnblogs.com/jiese/p/3168844.html 组合模式以树形结构为主,其目的是为了让客户

【设计模式】使用设计模式来解决设计问题

选择对象 面向对象设计最困难的部分是将系统分解成对象集合.因为要考虑许多因素:封装.粒度.依赖关系.灵活性.性能.演化.复用等等,它们都影响着系统的分解,并且这些因素通常还是互相冲突的. 设计的许多对象来源于现实世界的分析模型.但是,设计结果所得到的类通常在现实世界中并不存在.设计模式帮你确定并不明显的抽象和描述这些抽象的对象.例如,描述过程或算法的对象现实中并不存在,但它们却是设计的关键部分.Strategy模式描述了怎样实现可互换的算法族.State模式将实体的每一个状态描述为一个对象.这些

2.0设计模式怎样解决设计的问题

PS:以下皆为阅读<设计模式-可复用面向对象软件的基础>ISBN:978-7-111-07575-2 的笔记 1.寻找合适的对象 面向对象程序由对象组成.对象包括数据和对数据进行操作的过程,过程通常称为方法或操作.对象再收到客户的请求(或消息)后,执行相应的操作. 客户请求是使对象执行操作的唯一方法.操作又是对象改变内部数据的唯一方法.由于这些限制,对象内部状态是被封装的,它不能被直接访问,它的表示对于对象外部是不可见的. 面向对象设计最困难的部分是将系统分解成对象集合.因为要考虑许多因素:封

设计模式之六大设计原则

在上篇博文中提到了开放-封闭原则,没有细谈,这次我们来总结一下设计模式的几大原则. 1开放-封闭原则:是指软件实体(类.模块.函数等)应该可以扩展,但是不可修改. 对原则的理解:开闭原则是最具有理想主义色彩的一个原则,它是面向对象设计的终极目标,下面所要介绍的几个原则可以看成是为了符合开闭原则所作的努力和解决办法.对于开闭原则通俗的理解就是,能不改就不改,能少改尽可能的少改.周所周知,物质是运动的,世界是变化的,想要让一个事物永恒不变是不可能的,所以要想让软件绝对符合开闭原则是不可能的. 2单一

设计模式小结——六大设计原则

设计模式是一套由软件界前辈们总结出的可以反复使用的编程经验,旨在提高代码的可重用性,提高系统的可维护性,以及解决一系列复杂问题.设计模式包括6大设计原则和23种种设计模式.6大设计原则:单一职责原则SRP 应该有却仅有一个原因引起类的变更,即类最好只实现一种功能.高内聚. 单一职责的实现方式是一个职责一个接口. 单一职责适用于类和接口,同样适用于方法,一个方法也应该只做好一件事.里氏替换原则LSP 所有能使用父类的地方必须能透明地使用其子类的对象. 子类必须完全实现父类的方法,如果子类不能完整实

C#使用设计模式和软件设计原则构建应用程序 PartIII

依赖注入 这个原则的要点是什么.为什么你不能对类的实例进行再次硬编码?当我们编码,测试的时候,让我们关注一件很重要的事情.希望你知道单元测试并知道它的重要性.也许在你做任何编码之前你都应该首先设计你的测试,因此你应该很熟悉测试驱动开发.为了定义新功能你应该去写测试,你应该尝试去实现并开始编码直到测试通过.让我们先看看之前的文章的代码. public class DateBasedTaxFactory:ITaxFactory { Customer _customer; ITaxFactory _t

【小话设计模式】面向对象设计原则

1.单一职责原则 单一职责原则的核心思想就是:系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成.英文缩写SRP  Single Responsibility Principle 单一职责原则-->"高内聚,低耦合",每个类应该只有一个职责,此外只能提供一种功能,而引起类变化的原因应该只有一个.在设计模式中,所有的设计模式都遵循这一原则. 优点: 可以降低类的复杂度: 提高类的可读性,提高系统的可维护性: 变更引起的风险降低. 2.里氏替换原则 里氏

面向对象设计步骤二-------指定属性的类型和可见性,分配职责(GRASP),消息驱动,设计模式进行局部设计

增加遗漏的属性,指定属性的类型和可见性: 在面向对象设计阶段,需要对每个类进行详细设计,不全过程中遗漏的属性,并且确定每个属性的数据类型,指定每个属性的可见性:属性的可见性指外部对象对属性的访问权限,一般包括私有,保护和共有几种类型: 在实际开发中,除了那些比较简单且不常发生变化的属性可以直接暴露给客户以外,其他属性最好设置为私有或者保护并且最好都能用GetXXX()和SetXXX()等访问方法封装一下 分配职责,定义执行每个职责的方法: 职责:是一个类或者类型的契约或者义务 面向对象系统中的类

设计模式——6大设计原则

1.单一职责原则 单一职责原则的英文名称是Single Responsibility Principle,简称是SRP. 单一职责的定义是:有且仅有一个原因引起类的变更. 单一职责原则要求一个接口或者一个类只有一个原因引起变化,也就是说一个接口或类只有一个职责,它就负责一件事情. 建议是:接口一定要做到单一职责,类的世界尽量做到只有一个原因引起变化.2.里氏替换原则 里氏替换原则的英文名称是Liskov Substitution Principle,简称是LSP. 里氏替换原则的定义:所有引用基