写在前面
设计模式简单来说就是前人在一定的工作经验中,总结的一些代码开发的模式,这些模式可以让代码开发变得高内聚、低耦合,使拓展变得方便。记得当初在刚毕业的时候也看过设计模式,不过看得迷迷糊糊的,就算是看了,隔天也就忘了差不多了。出来工作时候有了一定的工作经验之后,再看设计模式理解就会深刻很多,所以建议是有一些编码经验之后再看设计模式,这样理解会更深刻点。当然,如果缺乏编码经验也可以看看,设计模式是经过了很长一段时间的发展,它是软件开发过程中的最佳实践,学习这些模式有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计。
软件设计模式的产生背景
“设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。
1987 年,肯特·贝克(Kent Beck)和沃德·坎宁安(Ward Cunningham)首先将建筑领域的模式思想应用在 Smalltalk 中的图形用户接口的生成中,但没有引起软件界的关注。
1994 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,在本教程中收录了 23 个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,GoF)匿名著称。
为什么要学习设计模式
设计模式已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计。
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。正确使用设计模式具有以下优点。
- 可以提高程序员的思维能力、编程能力和设计能力。
- 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
- 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
设计模式的目的
编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好的
- 代码重用性 (即:相同功能的代码,不用多次编写)
- 可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
- 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
- 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)
- 使程序呈现高内聚,低耦合的特性
设计模式分类
根据目的
根据模式是用来完成什么工作来划分,这种方式可分为创建型模式结构型模行为型模式
- 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。
- 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。
- 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。
根据作用范围
根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式
- 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF 中的工厂方法、(类)适配器、模板方法、解释器属于该模式。
- 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。
设计模式七大原则
1、单一职责(Single responsibility principle): 单一职责原则表示一个模块的组成元素之间的功能相关性。从软件变化的角度来看,对类来说,一个类应该只负责一项职责。
2、开闭原则(Open Close Principle): 开放-关闭原则表示软件实体 (类、模块、函数等等) 应该是可以被扩展的,但是不可被修改。(Open for extension, close for modification)
3、里氏代换原则(Liskov Substitution Principle):里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。
4、接口隔离原则(Interface Segregation Principle): 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
5、依赖倒转(Dependence Inversion Principle):这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
注:上面五个是面向对象的五个基本原则,也就是SOLID(首字母缩略字)
6、迪米特法则,又称最少知道原则(Demeter Principle): 一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
7、合成复用原则(Composite Reuse Principle):尽量使用合成/聚合的方式,而不是使用继承。