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