设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式是计算机软件领域比较抽象的内容,设计模式带给我们的是:使我们从复杂、烦乱的代码中解脱出来,让软件系统变得更加稳定、更加易于扩展,维护更加轻松。
为什么需要设计模式
设计模式的应用,无论对个人、企业、还是社会都有百利而无一害的。首先,它可以提升个人的编程能力、思维能力和设计能力,极大提高工作效率,让个人获得更大发展空间;其次,对于企业,应用设计模式可使软件产品质量得到保证,系统稳定性大大提升,为企业创造出更多的利润上升空间;最后,个人和企业都在不断地发展壮大,自然会创造出更多的社会价值,为社会作出更多的贡献。因此,我们需要设计模式、企业需要设计模式、社会也需要设计模式。设计模式或将成为改变一个人职场命运、一个企业成败关键、甚至一个社会 经济发展的重要因素。
软件设计遵循的基本原则
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)
设计模式是前人实践经验的总结,是经过千锤百炼的思想结晶。我们学习设计模式不是真正的目的,我们真正的目的是学习这种思想,并在实践当中具体应用,并且学会归纳和总结,让我们的思维活跃起来,不再拘泥于计算机编码,而是上升到一定的理论空间。让理论指导实践,实践充实理论,这样就会形成一种良性循环,不断提升自己的理论、实践能力,从而实现个人最大的社会价值。