笔试题目总结之五——设计模式
设计模式是一套软件开发领域经过多年经验总结出来的软件设计方法,它针对软件开发中经常遇到的设计问题提出了更灵活、更可靠的解决方案,所以,学习软件开发,了解一些设计模式对开发,对以后的发展都是有帮助的。
设计模式领域中的经典著作非Gof出品的《设计模式:可复用面向对象软件的基础》莫属,这本书详细介绍了23种软件设计方法,对于软件开发领域有着很大的影响。根据目的可以把设计模式分为三种:创建型,结构性,行为性。每种分别包含了不同的模式,介绍如下(具体讲解和代码可以参考:http://www.riabook.cn/doc/designpattern/)
- Creational 模式
- Structural 模式
- Behavioral 模式
根据《敏捷软件开发》中介绍,在设计软件时还应该遵循OO设计的五大原则:OCP,SRP,DIP,LSP,ISP。
1. SRP(Single Responsibility Principle 单一职责原则)
单一职责很容易理解,也很容易实现。所谓单一职责,就是一个设计元素只做一件事。什么是“只做一件事”?简单说就是少管闲事。现实中就是如此,如果要你专心做一件事情,任何人都有信心可以做得很出色。
OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。
2. OCP :开闭原则,很简单,一句话:“Closed for Modification; Open for Extension”——“对变更关闭;对扩展开放”。开闭原则其实没什么好讲的,我将其归结为一个高层次的设计总则。OCP的动机很简单:软件是变化的。不论是优质的设计还是低劣的设计都无法回避这一问题。OCP说明了软件设计应该尽可能地使架构稳定而又容易满足不同的需求。 为什么要OCP?答案也很简单——重用。
3.LSP——里氏替换原则
OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性“抽象”是语言提供的功能。“多态”由继承语义实现。 如此,问题产生了:“我们如何去度量继承关系的质量?”
Liskov于1987年提出了一个关于继承的原则“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“继承必须确保超类所拥有的性质在子类中仍然成立。”也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。
该原则称为Liskov Substitution Principle——里氏替换原则。
我们来研究一下LSP的实质。学习OO的时候,我们知道,一个对象是一组状态和一系列行为的组合体。状态是对象的内在特性,行为是对象的外在特性。LSP所表述的就是在同一个继承体系中的对象应该有共同的行为特征。
4.DIP 依赖倒置原则
依赖倒置(Dependence Inversion Principle)原则讲的是:要依赖于抽象,不要依赖于具体。
简单的说,依赖倒置原则要求客户端依赖于抽象耦合。原则表述:
抽象不应当依赖于细节;细节应当依赖于抽象;
要针对接口编程,不针对实现编程。
5.ISP 接口隔离原则
使用多个专门的接口比使用单一的总接口要好。广义的接口:一个接口相当于剧本中的一种角色,而此角色在一个舞台上由哪一个演员来演则相当于接口的实现。因此一个接口应当简单的代表一个角色,而不是一个角色。,如果系统设计多哥角色的话,则应当每一个角色都由一个特定的接口代表。狭义的接口(Interface):接口隔离原则讲的就是同一个角色提供宽、窄不同的接口,以对付不同的客户端。
当然,在软件开发实践过程当中,这些模式不是很简单地就可以套到软件设计上,要经过很多的思考和权衡。
一些参考内容:
http://www.cnblogs.com/sharplife/archive/2006/12/09/587142.html
http://zh.wikipedia.org/w/index.php?search=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F