设计模式 01 概论

发布于 2021-01-31 03:51

概论

什么是设计模式(design patterns)?

"Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice" — Christopher Alexander

“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。—— Christopher Alexander

这一句,引用自一位著名的建筑师 Alexander。他所指的是城市和建筑模式,但他的思想也同样适用于面向对象设计模式,只是在面向对象的解决方案里,我们用对象和接口代替了墙壁和门窗。

1994 年,Gang of Four(《设计模式》的四位作者,下面简称为 GoF)出版了《Design Patterns — Elements of Reusable Object-Oriented Software》(中文译名:设计模式——可复用面向对象软件的基础,下面简称为设计模式)。我们平时把它简称为《设计模式》,但也因此,忽略了“可复用”和“面向对象”这两个更为关键的要素。设计模式,是基于面向对象编程的,而它的核心就是可服用。

我们为什么要学习设计模式?

1. 看懂别人写的代码

面向对象,作为一种主流的编程范式,大部分的源码与框架都是以这种范式来编写。而其中,作者会为了一定的目的去使用设计原则、设计模式。如果你看不懂这些设计原则、设计模式,你可能会捉摸不透作者的设计思路。如果你看懂了其中设计原则、设计模式,那么你很快就能理解作者的设计思路,读代码就会变得轻松了。

2. 提高自己的代码质量

在工作中,主流的编程范式也是面向对象。掌握设计模式,以设计原则为指导,让代码的可阅读性,可复用性大大增加,提高自己的代码质量。

如何解决问题复杂性?

分解

人们面对复杂性有一个常见的做法:即分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。

抽象

更高层次来讲,人们处理复杂性有一个通用的技术,即抽象。由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型。

设计原则

设计模式是为了设计原则服务的,我们应该遵从设计原则,而不过度使用设计模式。

下面的每一种设计原则,暂时不作细讲。当出现应用了这种设计原则的案例时候再展开说明。没有案例,不好理解为什么提出了这种设计原则。

SOLID 原则

Single Responsibility Principle —— 单一职责原则Open Closed Principle —— 开放封闭原则Liskov Substitution principle —— 里氏替换原则Interface Segregation Principle —— 接口隔离原则Dependence Inversion Principle —— 依赖倒置原则

DRY 原则

Don't Repeat Yourself —— 不要写重复代码

KISS 原则

Keep It Simple and Stupid —— 尽量保持简单

YAGNI 原则

You Ain't Gonna Need It —— 不要过度设计

LOD 法则

Law of Demeter — 最小知识原则

设计模式成长之路

引用李建忠老师口中的“设计模式成长之路”:

“手中无剑,心中无剑”:见模式而不知

“手中有剑,心中无剑”:可以识别模式,作为应用开发人员使用模式

“手中有剑,心中有剑”:作为框架开发人员设计某些模式

“手中无剑,心中有剑”:忘掉模式,只有原则

C++ 的面向对象编程基础

文章中的代码的实现,使用 C++。作者希望读者了解 C++ 的面向对象编程基础,再回来阅读文章。

预告

下一篇将讲最为常用的设计模式:模版方法(template method)。

参考资料:

1.GoF.《Design Patterns — Elements of Reusable Object-Oriented Software》2.李建忠.《C++ 设计模式》极客邦3.冯永吉.《设计模式之美》 极客时间

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材