GRASP模式
1 信息专家模式: GRASP模式的核心,理解起来应该很容易。
2 变化预防模式: 提倡在可预测的变化或不安定因素的周围,用稳定的接口来承担职责。依赖于稳定的接口,将经常变化的代码提炼出一个稳定的接口,让其他的类依赖这个稳定的接口,变化的部分继承这个接口后一般在子类中实现。
3 纯虚构模式:提倡把那些非问题领域的职责分配给那些人工生成的或者容易此类职责的概念类。我们设计对象的时候应该尽量保持与现实世界里的对象一致。
4 多态性模式:提倡通过多态操作把基于类型的可变行为的定义职责分配给行为发生的类。把各变化的“行为”定义职责分别分配给具有相同操作行为界面的通用接口的实现子类,利用多态性适应行为的可变性。
5 间接性模式: 当多个类之间存在复杂的消息交互(关联)时,提倡类之间不直接进行消息交互处理,而是导入第三方类,把责任分配给第三方类,降低类之间的耦合程度。
6 控制器模式: 应用控制器模式的系统,对系统事件进行集中处理,所以:
- 防止同类职责的分散。满足高内聚,低耦合原则。
- 有利于共通处理。
- 变化的高适应能力。能够把变化的修改范围控制在最小范围之内
7 低耦合模式和高内聚模式: 低耦合模式是GRASP模式中为降低类之间的关联程度,适应可变性而提出的面向对象设计的原则性模式。高内聚与低耦合模式是GRASP其他模式的根本。
8 创建者模式:一般来说,应用创建者模式,可以从上之下设计好类之间的包含或聚集关系阶层图,让每个类负责创建自己包含的类的实例。
设计模式怎样解决设计问题
设计模式采用多种方法解决面向对象设计者经常碰到的问题。这里给出几个问题以及使用设计模式解决它们的方法。
1寻找合适的对象
面向对象程序由对象组成,对象包括数据和对数据进行操作的过程,过程通常称为方法或操作。对象在收到客户的请求(或消息)后,执行相应的操作。
客户请求是使对象执行操作的唯一方法,操作又是对象改变内部数据的唯一方法。由于这些限制,对象的内部状态是被封装的,它不能被直接访问,它的表示对于对象外部是不可见的。
面向对象设计最困难的部分是将系统分解成对象集合。因为要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、演化、复用等等,它们都影响着系统的分解,并且这些因素通常还是互相冲突的。
设计模式帮你确定并不明显的抽象和描述这些抽象的对象。例如,描述过程或算法的对象现实中并不存在,但它们却是设计的关键部分。
2决定对象的粒度
对象在大小和数目上变化极大。它们能表示下自硬件或上自整个应用的任何事物。那么我们怎样决定一个对象应该是什么呢?
设计模式很好地讲述了这个问题。Facade(4.5)模式描述了怎样用对象表示完整的子系统,Flyweight(4.6)模式描述了如何支持大量的最小粒度的对象。其他一些设计模式描述了将一个对象分解成许多小对象的特定方法。AbstractFactory(3.1)和Builder(3.2)产生那些专门负责生成其他对象的对象。Visitor(5.10)和Command(5.2)生成的对象专门负责实现对其他对象或对象组的请求。
3指定对象接口
对象声明的每一个操作指定操作名、作为参数的对象和返回值。对象操作所定义的所有操作型构的集合被称为该对象的接口。
类型是用来标识特定接口的一个名字。一个对象可以有许多类型,并且不同的对象可以共享同一个类型。对象接口的某部分可以用某个类型来刻画,而其他部分则可用其他类型刻画。两个类型相同的对象只需要共享它们的部分接口。接口可以包含其他接口作为子集。当一个类型的接口包含另一个类型的接口时,我们就说它是另一个类型的子类型,另一个类型称之为它的超类型。我们常说子类型继承了它的超类型的接口。
在面向对象系统中,接口是基本的组成部分。对象只有通过它们的接口才能与外部交流。对象接口与其功能实现是分离的,不同对象可以对请求做不同的实现。
当给对象发送请求时,所引起的具体操作既与请求本身有关又与接受对象有关。发送给对象的请求和它的相应操作在运行时刻的连接就称之为动态绑定。