设计模式简介
软件设计具有良好的复用性,才是好的设计。但是软件复杂的变化却是服用新的天敌;
软件设计复杂的根本原因有:变化(客户需求变化、技术平台变化、开发团队的变化、市场变化... ...)。面对复杂的问题可以进行分而治之,将大的问题分解为许多小的问题;对于更高层次的问题就需采用抽象的方法,忽视它的具体细节,而去处理泛化和理想化的对象模型。
面向对象设计原则
为了较好的复用性,就必须隔离变化减小变化带来的影响;各司其责,各个内有不同的责任,那么由于需求的变化导致的新增类型不会对之前造成影响;
面向对象的八大设计原则:1. 依赖倒置原则DIP(高层模块稳定不应该依赖于底层的变化;2抽象稳定不应该依赖于实现细节的变化;但都应该依赖于抽象);2. 开放封闭原则OCP(对(类模块)扩展开放,对(类模块)更改封闭);3. 单一职责原则(一个类应该仅有一个引起它变化的原因,变化方向隐含着类的责任);4. liskov替换原则LSP(子类能够替换它们的基类is-a);5. 接口隔离原则ISP(接口应该小而完备);6. 优先使用对象组合而不是类继承(类继承通常为“白箱复用”,组合为“黑箱复用”,继承在某种程度上破坏了封装性,而组合只要有良好的接口就好);7. 封装变化点(使用封装来创建对象见的分界层);8. 针对接口编程,而不是针对实现。
模板方法
设计模式从目的来看主要分为三大类:创建型、结构型、行为型;从封装变化角度可以分为:
重构:静态->动态、早绑定->晚绑定、继承->组合、编译时依赖-运行时依赖、
组件协作模式通过晚期绑定实现松耦合,是二者间协作时常用模式,包括:Template Method、strategy、Observer/Event。
对于一项任务,具有稳定的操作结构,但是子步骤却有很多改变需求,或者无法和整体结构达到完整的时间同步。就需要采用Template Method,使得子类可以复用一个算法的结构同时支持子类的结构变化,是一个非常常用的设计模式。
策略模式Strategy
定义一系列算法,把他们一个个封装起来,并使他们可互相替换,是的算法可以独立于使用它的客户程序而变化。
观察者模式Observer
一个对象的状态发生改变,所有依赖的所有对象都将得到通知,但是如果这种依赖关系过于紧密,将使得软件不能很好地抵御变化。使用Observer可以将这种依赖关系弱化,并稳定,从而实现松耦合。
定义对象一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新即为观察者模式。
装饰模式Decorator
属于单一职责模式,在软件设计过程中,使用继承的到的代码,往往会随着需求的变化,之类急剧膨胀,同时充斥着很多重复代码,这个时候关键是划分责任。
有时候可能会过多的使用继承来扩展功能,这种扩展方式缺乏灵活性,随着扩展增加,会产生很多的子类。在这种情况下就可以采用Decorator将继承用复合来替换,能大幅减小代码的复杂度,并且更为灵活。
Decorator在接口上表现为继承的模式,但是在实现上又表现为复合的关系,即使用了一个Component类。其主要应用于解决主体类在多个方向上的扩展功能。
桥模式Bridge
桥模式就是将抽象部分(业务功能)与实现(平台)部分分离,使他们都可以独立变化的设计模式。使用对象间的组合关系解耦呢抽象和实现之间的故有绑定关系,让抽象和思想有自己的变化维度。
桥模式主要解决由于某些代码由于固有逻辑原因,使得它们有两个或多个变化维度,是代码的复杂度大规模增加的问题。一般在两个非常强的变化维度可以采用Bridge的扩展模式。