设计模式的概念最早是由一名建筑师提出来的。他试图在图纸上用一种结构化、可重用化的方法,获得建筑的基本要素,从而能够将很多其它的精力放在详细建筑物和城镇的设计上。逐渐的,这样的思想在软件领域流行起来,并获得发展。
设计模式(Design pattern)是一套被重复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更easy被他人理解、保证代码可靠性。
设计模式是计算机软件领域比較抽象的内容。设计模式带给我们的是:使我们从复杂、烦乱的代码中解脱出来,让软件系统变得更加稳定、更加易于扩展,维护更加轻松。
为什么须要设计模式
设计模式的应用。不管对个人、企业、还是社会都有百利而无一害的。首先。它能够提升个人的编程能力、思维能力和设计能力。极大提高工作效率。让个人获得更大发展空间。其次。对于企业,应用设计模式可使软件产品质量得到保证,系统稳定性大大提升,为企业创造出很多其它的利润上升空间;最后,个人和企业都在不断地发展壮大,自然会创造出很多其它的社会价值。为社会作出很多其它的贡献。因此,我们须要设计模式、企业须要设计模式、社会也须要设计模式。设计模式或将成为改变一个人职场命运、一个企业成败关键、甚至一个社会
经济发展的重要因素。
软件设计遵循的基本原则
1、单一职责原则(Single Responsibility Principle,简称SRP)
单一职责原则。就一个类而言。应该仅有一个引起它变化的原因。假设一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完毕其它职责的能力。这样的耦合会导致脆弱的设计。当变化发生时,设计会遭受到意想不到的破坏。
而软件设计真正要做的很多内容。就是发现职责,并把这些职责相互分离。
2、 开放--封闭原则(The Open-Closed Principle,简称OCP)
开放--封闭原则。是说软件实体(类、模块、函数等等)应该能够扩展。可是不能够改动。即对于扩展是开放的,对于更改是封闭的。 我们不可能做到未卜先知,在设计的时候尽可能让一个类足够好,设计好了就不要去改动了;不能全然封闭的情况下,当发生变化时,我们就创建抽象来隔离以后发生的同类变化。
3、依赖倒转原则(Dependence Inversion Principle )
依赖倒转原则。指高层模块不应该依赖低层模块,两个都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。说白了就是要针对接口编程,不要对实现编程。举个样例:计算机硬件中。假设内存坏了,那么仅仅须要换一个内存条就能够了,而不须要去换一个主板,在这里内存是一个接口类,仅仅要符合他的规格要求即可,不管是那一根。
4、里氏代换原则(Liskov Substitution Principle,简称LSP)
里氏代换原则,子类型必须可以替换掉他们的父类型。在软件里面,把父类都替换成其子类。程序的行为不会发生变化。
正是因为子类型的可替换性才使得使用父类型的模块在无需改动的情况下就行扩展。
5、迪米特法则(Law of Demeter)
迪米特法则,假设两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。假设当中一个类须要调用还有一个类的某一个方法时,能够通过第三者转发这个调用。类之间的耦合越弱,就越有利于复用。一个处在弱耦合的类被改动,不会对有关系的类造成波及。 主要是强调了类之间的松耦合。
6、合成/聚合复用原则(Composition/Aggregation Principle]。简称CARP)
合成聚合复用原则。尽量使用合成/聚合,尽量不使用类继承。
合成聚合是“has a”的关系,而继承是“is a”的关系。因为继承是一中强耦合的结构,父类变。子类必变。所以不是“is a”关系,我们一般不要用继承。
优先使用合成聚合复用原则,有助于保持每一个类的封装。减少继承的层次。
设计模式的分类
依照范围来分。设计模式能够分为类模式和对象模式。
类模式用来处理类和子类之间的关系。这些关系通过几成建立,是静态的,在编译时刻便确定下来;
对象模式是处理对象间的关系,这些关系在执行时是能够变化的,更具动态性。
依照目的来分,设计模式能够分为创建型模式、结构型模式和行为型模式。
创建型模式用来处理对象的创建过程。
包含工厂方法(Factory Method)
抽象工厂(Abstract Factory)
建造者(Builder)
原型(Prototype)
单例(Singleton)
结构型模式用来处理类或者对象的组合;
包含适配器(Adapter)
桥接(Bridge)
组合(Composite)
装饰者(Decorator)
外观(Facade)
享元(Flyweight)
代理(Proxy)
行为型模式用来对类或对象如何交互和如何分配职责进行描写叙述。
包含责任链(Chain of Responsibility)
命令(Command)
解释器(Interpreter)
迭代器(Iterator Pattern)
中介者(Mediator)
备忘录(Memento)
观察者(Observer)
状态(State)
策略(Strategy)
模板方法(Template Method)
訪问者(Visitor)
设计模式是前人实践经验的总结。是经过千锤百炼的思想结晶。我们学习设计模式不是真正的目的,我们真正的目的是学习这样的思想,并在实践其中详细应用。而且学会归纳和总结,让我们的思维活跃起来,不再拘泥于计算机编码,而是上升到一定的理论空间。让理论指导实践,实践充实理论,这样就会形成一种良性循环。不断提升自己的理论、实践能力,从而实现个人最大的社会价值。