设计模式能够确保系统能以特定方式变化,从而帮助你避免从新设计系统。每个设计 模式容许系统结构的某个方面的变化独立于其余方面,这样产生的系统对于某一种特殊变化 将更健壮。算法
下面阐述了一些致使从新设计的通常缘由,以及解决这些问题的设计模式:设计模式
1) 经过显式地指定一个类来建立对象 在建立对象时指定类名将使你受特定实现的约束 而不是特定接口的约束。这会使将来的变化更复杂。要避免这种状况,应该间接地建立对象。学习
设计模式:抽象工厂A b s t r a c t F a c t o r y,工厂方法F a c t o r y M e t h o d,原型P r o t o t y p e。优化
2) 对特殊操做的依赖 当你为请求指定一个特殊的操做时,完成该请求的方式就固定下 来了。为避免把请求代码写死,你将能够在编译时刻或运行时刻很方便地改变响应请求的方 法。设计
设计模式: 职责链 C h a i n o f R e s p o s i b i l i t y ,命令模式 C o m m a n d 。
3) 对 硬 件 和 软 件 平 台 的 依 赖 外 部 的 操 做 系 统 接 口 和 应 用 编 程 接 口 ( A P I ) 在 不 同 的 软 硬 件 平台上是不一样的。依赖于特定平台的软件将很难移植到其余平台上,甚至都很难跟上本地平 台的更新。因此设计系统时限制其平台相关性就很重要了。代理
设计模式: 抽象工厂 A b s t r a c t F a c t o r y ,桥接 B r i d g e 。 server
4) 对对象表示或实现的依赖 知道对象怎样表示、保存、定位或实现的客户在对象发生 变化时可能也须要变化。对客户隐藏这些信息能阻止连锁变化。 对象
设计模式: 抽象工厂 A b s t r a c t F a c t o r y, 桥接B r i d g e ,备忘录M e m e n t o,代理 P r o x y继承
5) 算法依赖 算法在开发和复用时经常被扩展、优化和替代。依赖于某个特定算法的对 象在算法发生变化时不得不变化。所以有可能发生变化的算法应该被孤立起来。 接口
设计模式: 建立者 B u i l d e r,迭代器I t e r a t o r,策略S t r a t e g y,模版方法 T e m p l a t e M e t h o d ,访问者 V i s i t o r
6) 紧耦合 紧耦合的类很难独立地被复用,由于它们是互相依赖的。紧耦合产生单块的 系统,要改变或删掉一个类,你必须理解和改变其余许多类。这样的系统是一个很难学习、 移植和维护的密集体。
松散耦合提升了一个类自己被复用的可能性,而且系统更易于学习、移植、修改和扩展。 设计模式使用抽象耦合和分层技术来提升系统的松散耦合性。
设计模式: 抽象工厂 A b s t r a c t F a c t o r y ,命令模式 C o m m a n d ,外观模式 F a c a d e ,中介者 M e d i a t o r,观察者 Observer,职责链Chain of Responsibility。
7) 经过生成子类来扩充功能 一般很难经过定义子类来定制对象。每个新类都有固定 的实现开销(初始化、终止处理等)。定义子类还须要对父类有深刻的了解。如,重定义一个操 做可能须要重定义其余操做。一个被重定义的操做可能须要调用继承下来的操做。而且子类 方法会致使类爆炸,由于即便对于一个简单的扩充,你也不得不引入许多新的子类。
通常的对象组合技术和具体的委托技术,是继承以外组合对象行为的另外一种灵活方法。 新的功能能够经过以新的方式组合已有对象,而不是经过定义已存在类的子类的方式加到应 用中去。另外一方面,过多使用对象组合会使设计难于理解。许多设计模式产生的设计中,你 能够定义一个子类,且将它的实例和已存在实例进行组合来引入定制的功能。
设计模式: 桥接B r i d g e,职责链 C h a i n o f R e s p o n s i b i l i t y,组合C o m p o s i t e,装饰者 D e c o r a t o r,观察者 O b s e r v e r ,策略 S t r a t e g y。
8) 不能方便地对类进行修改 有时你不得不改变一个难以修改的类。也许你须要源代码 而又没有 (对于商业类库就有这种状况 ),或者可能对类的任何改变会要求修改许多已存在的其 他子类。设计模式提供在这些状况下对类进行修改的方法。
设计模式: 适配器A d a p t e r, 装饰者D e c o r a t o r ,访问者 Vi s i t o r 。