您现在的位置是:首页 >学无止境 >什么是设计模式?网站首页学无止境
什么是设计模式?
“每一个模式描述了一个在我们周围不断重复发生的问题,以及问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。
设计模式的核心:提供了相关问题的解决方案,使得人们可以更加简单方便的复用前人经验所得的成功的、有效的软件/系统设计框架。
01 | 概念
刚开始了解设计模式时,这个词一听就很高大上,实际在以往的生活中处处是“设计模式”。如中学时代理科套用的数学公式、如做会议纪要时用到的PPT模板、如做算法题时套用的解题思路、如软件代码重构时将重复代码封装为一个函数的操作等都是“设计模式”的一种体现。
当然不是说“设计模式”就等于数学上的数学公式,因为“设计模式”是一个模板(类比C++中的模板类),所以一个设计模式应可用于多种不同的场合,可以在类似问题的不同场景上使用,具有高复用性和高可移植性的特点。
简单来说,设计模式的概念就是 可重复使用的、高效的、易读的、有目标性的、高可移植性经验总结模板
02 | 要素
设计模式一般有以下四个基本要素:
-
模式名称(Pattern Name):是一个帮助记忆的名词,常用一两个词来描述该设计模式对应的问题、解决方案和效果等。合适的模式名称也是设计模式的一个重点,可以更好的帮助使用者对该模式的理解
-
问题(Problem):描述了该设计模式的应用场景,通常在本要素中对设计模式的问题所在以及所处环境进行描述,作为设计模式的一个引言,类似于 github 上工程的 readme
-
解决方案(Solution):描述了该设计模式的组成成分、各部分之间的关系以及各自的职责和通信合作方式。概念部分说到设计模式是一个模板,所以在解决方案上一般不会描述一个特定问题的解决方案,而是描述对于这类问题应该怎么去解决的思路
-
效果(Consequences):描述了该设计模式产生的效果以及过程中要注意的资源问题。效果上包括了对系统灵活性、扩展性以及可移植性的影响;资源问题上包括了应用该设计模式时在系统上产生的时间、空间的消耗
03 | 分类
针对不同类型的问题,同样的就有不同类型的设计模式,主要分为三大类 创建型、结构型、行为型
创建型 | 结构型 | 行为型 | |
---|---|---|---|
对象 | 抽象工厂模式、生成器模式、原型模式、单例模式 | 适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式 | 责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式 |
-
创建型模式
创建型设计模式抽象了实例化的过程,帮助系统独立于如何创建、整合它其中的对象以其职责。如一个类创建型模式使用继承改变实例化的类,而一个对象创建型模式将实例化委托给另一个对象,其主要的特点如下:
-
将系统使用的具体类的信息封装起来;
-
将系统中所使用类的实例是如何创建和整合隐藏起来
所以创建型模式主要体现在对象的创建
以单例模式为例:
-
目的:保证一个类仅有一个实例,并提供一个可全局访问它的接口
-
应用:单例模式主要应用场景如下
-
当类只有一个实例而且客户可以从一个众所周知的接口访问它时;
-
当这个唯一实例是可以通过子类化可扩展的,并且客户无效更改代码就能使用一个扩展的实例时;
-
-
-
结构型模式
结构型设计模式采用继承机制来组合系统接口,比如采用多重继承的方式将两个以上的类组合成一个大类,这个大类包含了所有父类的性质,有助于多个独立开发的类进行协同工作。所以结构型设计模式有一个类名称 —— 适配器(Adapter),它不仅可以对多个类的接口和实现进行整合,还可以对一些对象进行整合。所以结构型设计模式主要体现在处理类、对象之间的组合关系
以适配器模式为例:
-
目的:将一个类的接口转换称客户希望的另外一个接口,使得原本不适用的接口变成可以工作
-
应用:适配器模式主要应用场景如下:
-
想使用一个已存在类的不可用的接口时;
-
想创建一个可以与其他不相关类协同工作的类时
-
-
-
行为型模式
行为型设计模式不仅描述对象或类的模式,还描述它们之间的通信模式,显现他们在运行时复杂的控制环节,将难以理解的控制流体思路转换成不同对象之间的联系思路,主要涉及算法和对象之间职责的分配
以模板方法模式为例:是一个算法的抽象定义,它逐步定义算法的各个步骤,如每一个步骤调用哪个抽象操作等。
-
目的:定义一个操作中的算法股价,将一些步骤放到子类中,使得子类可以不改变算法的整体结构
-
应用:模板方法模式主要应用场景如下:
-
一次性实现一个算法的不变部分,将可变的行为留给子类来实现;
-
各个子类中公共的行为提取出来放在一个公共父类中,有效避免代码重复;
-
-
04 | 总结
设计模式就是对不同类型的相似问题的解决方法进行经验总结的结果。
对于软件设计模式来说,确定了所包含的类和实例之间的协作方式以及职责所在,每一个设计模式都描述了对于什么样的问题应该在什么时候使用它,在有约束条件的情况是否还有效,以及最后产生的作用和资源消耗。