« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
暂无公告... |
Blog信息 |
blog名称:七月天 日志总数:19 评论数量:84 留言数量:0 访问次数:201221 建立时间:2004年11月4日 |

| |
[设计模式]设计模式(5)如何解决设计问题 原创空间, 读书笔记, 软件技术
torrent 发表于 2005/8/5 19:05:27 |
-----------设计模式翻译(5)¥¥¥¥¥(最近有点忙,不过还是要抽点时间弄完它)
------------------------------------------------------------------------------------------------------
设计模式采用许多不同的方法来解决面向对象设计方面许多的问题。下面列出一些类似问题和用设计模式来解决的办法。
发现合适的对象
面向对象编程的基础是对象。一个对象包括数据及处理数据的过程,过程又称为方法或操作。对象在接受到客户的请求Request(或消息Message)执行某个操作。
(发送)请求是使得对象执行操作的唯一方法;操作是改变对象内部数据的唯一途径。因为这些限制,对象的内部状态可以说是被封装,不能够直接访问,其表示在对象外部也是不可见的。
面向对象设计最难的部分是将系统分解为对象,这因为多个因素的影响:封装、粒度、依赖、灵活性、性能、演变、可重用性、等等。这些因素都能影响分解过程,并常常存在冲突。
面向对象设计方法学有不同的侧重点。你可以使用问题描述,列出所有的名词和动词,接着设计相应的类和操作;你也可以关注系统的协作与职责关系;或者对现实世界建模,再由分析到设计的过程中得出对象。常常可见到哪种方法最好的争论。
设计中,很多对象都由分析模型而得出,但面向对象设计常常出现在现实世界中没有对应物的对象。有些是低级的类如数组,而有些则是高级的类,如,合成模式介绍了一种统一处理对象的提取(对象)就没有实际的对应物。对现实世界的严格建模只能反映当前的现实而不能反映日后的状况。在设计时考虑对显露出来的()的提取是达成设计灵活性的关键所在。
设计模式可帮你识别这种不明显的提取,以及能够捕获这种提取的对象。例如,在现实中不会出现的表示处理或算法的对象,在灵活的设计中是至关重要的部分。在策略模式中,描述了如何实现可替代的算法族;在状态模式中,对每个实体的状态表示为对象;这些对象在分析过程、甚至在早期的设计过程中很难发现,对它们的发现出现在其后的为重用和灵活性设计的过程当中。
决定对象的粒度
对象的大小和数目各不相同。从底层的硬件到完整的应用,都能用对象来表示。那么,我们怎么来决定对象的粒度呢?
设计模式也涉及到了这个问题。Façade模式描述了怎么将一个子系统表示为一个对象;轻量Flyweight模式描述了如何用最合适的粒度来支持多个对象;还有其它的设计模式描述了将某个对象分解到较小的对象的方法;抽象工厂和构建者模式产生对象,该对象唯一的目的就是构建其它对象;访问者和命令模式同样产生对象,其目的是向其它对象或对象组发送请求。
描述对象接口
对象操作的定义是通过对象指定操作名、参数、和返回值,这些是一个操作的指定要素(signature),所有操作的要素集合被称为对象的接口。接口指明了可以发送给对象的请求的完整集合,任何匹配对象接口要素的请求将发送给相应的对象。
??类型用来指明特定的接口。如果某个对象接受的请求定义在一个称为“Window”的接口上,我们称这个对象具有“Window”类型。一个对象可能有多个类型,不同的对象也可共有一个类型。对象的某部分可能具有某个类型特征,而其它部分确具有另外的类型特征。具有相同类型的两个对象需要共享它们的部分接口。接口中又能够包含其它接口作为子集,该接口的类型是被包含的接口的子类型subtype,相应的,被包含的接口的类型是该类型的超类型supertype。通常,我们说子类型继承了超类型的接口。
接口是面向对象编程的基础,对象是通过其接口而为外界所知。不通过接口,无法了解和操纵一个对象。对象的接口没有描述它本身的实现细节,这意味着两个具有相同接口的对象可以具有不同的实现。
当请求发送到对象时,具体操作的执行依赖于请求和接受对象。支持相同请求的不同对象为了完成请求执行不同的操作。一个对对象的请求与对象的某个操作之间在运行时的联系称为动态绑定(dynamic binding)。
动态绑定意味着对特定实现的请求到运行时才提交。因此,知道了具备可接受某种请求的接口的对象,就可以编写出期望一个对象具备特定接口的程序。而且,动态绑定让你能够在运行时替换具有相同接口的对象,这种替换能力即多态性(polymorphism),它是面向对象的一个关键概念。多态性简化了客户的定义、减少了对象之间的耦合、并使得可在运行时改变彼此的关系。
通过识别关键元素和递交给接口的数据的种类,设计模式有助于定义接口。某些设计模式将告诉你什么不应该放到接口部分,纪念品模式就是一个很好的例子,它描述了如何封装和保存对象的内部状态,以利对象在其后保存该状态。这一模式规定纪念品对象必须定义两个接口:一个限制性接口,使得客户能够保持和拷贝纪念品;和一个特权接口,只有原始对象有权使用,用来保存和抽取纪念品的状态。
设计模式也描述了接口之间的关系。模式经常需要一些相同接口的类,或者,给某些类的接口加上限制。例如,装饰器和代理模式就需要装饰对象和代理对象具备与装饰和代理客户一致的接口。在访问者模式中,访问者接口必须反映所有类的对象,以便访问者访问。
---------------------------------------------(本节未完,留待下次) |
|
|