设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。
面向对象设计原则概述
对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。在面向对象设计中,可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想,可以从不同的角度提升一个软件结构的设计水平。
面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。面向对象设计原则也是我们用于评价一个设计模式的使用效果的重要指标之一,在设计模式的学习中,大家经常会看到诸如“XXX模式符合XXX原则”、“XXX模式违反了XXX原则”这样的语句。
最常见的7种面向对象设计原则如下表所示:
表1 7种常用的面向对象设计原则
设计原则名称 | 定 义 | 使用频率 |
单一职责原则(Single Responsibility Principle, SRP) | 一个类只负责一个功能领域中 的相应职责 | ★★★★☆ |
开闭原则(Open-Closed Principle, OCP) | 软件实体应对扩展开放,而对 修改关闭 | ★★★★★ |
里氏代换原则(Liskov Substitution Principle, LSP) | 所有引用基类对象的地方能够 透明地使用其子类的对象 | ★★★★★ |
依赖倒转原则(Dependence Inversion Principle, DIP) | 抽象不应该依赖于细节,细节 应该依赖于抽象 | ★★★★★ |
接口隔离原则(Interface Segregation Principle, ISP) | 使用多个专门的接口,而不使 用单一的总接口 | ★★☆☆☆ |
合成复用原则(Composite Reuse Principle, CRP) | 尽量使用对象组合,而不是继 承来达到复用的目的 | ★★★★☆ |
迪米特法则(Law of Demeter, LoD) | 一个软件实体应当尽可能少地 与其他实体发生相互作用 | ★★★☆☆ |
总结:这 7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。
【开闭原则】是总纲,它告诉我们要【对扩展开放,对修改关闭】;
【里氏替换原则】告诉我们【不要破坏继承体系】;
【依赖倒置原则】告诉我们要【面向接口编程】;
【单一职责原则】告诉我们实现【类】要【职责单一】;
【接口隔离原则】告诉我们在设计【接口】的时候要【精简单一】;
【迪米特法则】告诉我们要【降低耦合度】;
【合成复用原则】告诉我们要【优先使用组合或者聚合关系复用,少用继承关系复用】。
设计模式概述
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式不是一种方法和技术,而是一种思想。
设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使设计的程序可复用。
学习设计模式能够促进对面向对象思想的理解,反之亦然。它们相辅相成。
设计模式的类型
总体来说,设计模式按照功能分为三类23种:
创建型(5种) : 作用是将对象的创建和对象的使用分离。new Student(); student.study();包括:工厂模式、抽象工厂模式、单例模式、原型模式、构建者模式。
工厂模式:批量生产(属性一致)
构建者模式:私人定制(属性不一致)
单例模式:只会生产一个产品
原型模式:给我一个对象,我会产生一样的对象
结构型(7种):适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式
行为型(11种):模板方法模式、策略模式、观察者模式、中介者模式、状态模式、责任链模式、命令模式、迭代器模式、访问者模式、解释器模式、备忘录模式。