该篇文章结合《研磨设计模式》以及CSDN上的优质文章,粗略的介绍了设计模式的基本概念。在学习设计模式之前有一个基础的理解,对如何学习设计模式有一个基本的方向。
设计模式简述
一、何为设计模式
1.1 设计模式的概念
设计模式:是指在软件开发中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案。
软件开发中:并不能说设计模式是软件行业独有的,事实上,很多行业都有自己的设计模式。而书中讲解的设计模式仅限于在软件开发行业中所使用的。经过验证的:客观的说,每个人都可以总结一些用于解决特定环境下、重复出现的、特定问题的解决方案,但并不是每个人的方案都能称为**设计模式**,这些方案必须经过足够的测试验证,并得到同志们的认可和公认,才有可能称得上**设计模式**。
特定环境下:问题一定是在某个场景下的出现的,不能脱离实际的环境去讨论问题的解决方法,因为不同的环境下,即使是同一问题,解决方法也有可能大相径庭。
重复出现的:如果是对于一些独特的问题,不会重复出现的,这样的解决方案往往是具有独特性的,那么总结它们的解决方案就显得多此一举。只有这些特定问题“重复出现”,那么为这些问题总结出来的解决方案才是有意义的行为,因为当这些问题再次出现的时候,那么就可以复用总结的方案去解决问题。
特定问题:说明设计模式不是哆啦A梦,它并不具备神奇的口袋,并不是什么问题都能解决,通常一个设计模式仅仅解决某个或者某些特定的问题。因此不要迷信设计模式,也不要泛滥使用设计模式,设计模式解决不了那么多的问题,它只是“特定问题”的解决方案。
1.2 设计模式的理解
- 设计模式是解决某些问题的办法。
- 设计模式不是凭空想象出来的,是经验的积累和总结。
- 设计模式并不是一成不变的,而是在不断的发展中。
- 设计模式并不是软件行业独有的,各行各业都有自己的设计模式。
二、设计模式有何
2.1 设计模式的四要素
模式名称(Pattern Name)
一个助记名,用一两个词来描述模式的问题、解决方案和效果。
问题(Problem)
描述了应该何时使用设计模式。它解决了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,也可能描述了导致不灵活设计的类或对象结构。
解决方案(Solution)
描述了护色剂的组成成分,它们之间的相互关系及各自的职责和协作方式。
效果(Consequences)
描述了模式应用的效果及使用模式应该权衡的问题。
2.2 设计模式的分类
范围 | 创建型 | 结构性 | 行为型 |
---|---|---|---|
类 | 工厂方法模式 Factory Method | 适配器模式(类) Adapter | 解释器模式 Interpreter 模板方法模式 Template Method |
对象 | 抽象工厂模式 Abstract Factory 建造者模式 Builder 原型模式 Prototype 单例模式 Singleton |
适配器模式(对象) Adapter 桥接模式 Bridge 组合模式 Composite 装饰者模式 Decorator 外观模式 Facade 享元模式 Flyweight 代理模式 Proxy |
职责链模式 Chain Of Responsibility 命令模式 Command 迭代器模式 Iterator 中介者模式 Mediator 备忘录模式 Memento 观察者模式 Observer 状态模式 State 策略模式 Strategy 访问者模式 Visitor |
进一步细致分类:
范围 | 创建型 | 结构性 | 行为型 |
---|---|---|---|
对象创建 | 工厂方法模式 Factory Method 抽象工厂模式 Abstract Factory 建造者模式 Builder 原型模式 Prototype 单例模式 Singleton |
||
接口适配 | 适配器模式 Adapter 桥接模式 Bridge 外观模式 Facade |
||
对象去耦 | 中介者模式 Mediator 观察者模式 Observer |
||
抽象集合 | 组合模式 Composite | 迭代器模式 Iterator | |
行为扩展 | 装饰者模式 Decorator | 访问者模式 Visitor 职责链模式 Chain Of Respinsibility |
|
算法封装 | 模板方法模式 Template Method 策略模式 Strategy 命令模式 Command |
||
性能与对象访问 | 享元模式 Flyweight 代理模式 Proxy |
||
对象状态 | 备忘录模式 Memento 状态模式 State |
||
其他 | 解释器模式 Interpreter |
三、设计模式学习
3.1 为何学习设计模式
设计模式已经成为软件开发人员的“标准词汇”
一天小菜遇到了一个开发问题,然后向大鸟去请教讨论。大鸟在知道了具体的问题后说:“你可以尝试使用”XXX模式”(XXX是某个设计模式的名称)去解决这个问题。“此时,小菜一脸茫然,XXX设计模式是个啥,如果是这样的话,就无法交流了。所以我们要学习设计模式,因为很多软件开发人员在平时交流的时候,只是使用设计模式的名称,而不会深入说明其具体的内容。
学习设计模式是个人技术能力提高的捷径
学习设计模式,可以学习到众多前辈的经验,吸收和领会他们的设计思想,掌握他们解决问题的方法,就相当于站在这些巨人的肩膀上,可以让我们个人的技术能力得到快速的提升。学习设计模式虽然有一定的困难,但绝对是快速提高个人技术能力的捷径。
不同重复发明轮子
设计模式是解决某些特定问题的解决方案。当我们再次面对这些问题的时候,就不用自己从头来解决这些问题,复用这些方案即可。
3.2 学习设计模式的层次
基本入门级
要求能够正确理解和掌握每个设计模式的基本知识,能够识别在什么场景下、出现了什么样的问题、采用何种方案来解决它,并能够在实际的程序设计和开发中套用相应的设计模式。
基本掌握级
除了具备基本入门级的要求外,还要去能够结合实际应用场景,对设计模式进行变形使用。事实上,在实际开发中,经常会碰到与标准模式的应用场景有一些不一样的情况,此时要合理地使用设计模式,就需要对它们进行适当的变形,而不是僵硬的套用。要进行变形的前提是要能准确深入的理解和把握设计模式的本质,只有把握住本质,才能确保正确变形使用而不是误用。
深入理解运用级
要从思想和方法上吸收设计模式的精髓,并融入到自己的思路中,在进行软件的分析和设计的时候,能随意地、自然而然地应用,就如同自己思维的一部分。
3.3 如何学习设计模式
首先要调整好心态,不要指望一蹴而就,不可浮躁。
学习和掌握设计模式需要一个过程,不同的阶段看这些设计模式绘有不同的领悟和感受。要向真正理解和掌握,必须要上升到一定的难度和深度,让你看完后思考,思考后应用,然后再看、再思考、再应用,如此反复,方能成就。
学习设计模式第一步:准确理解每个设计模式的功能、基本结构、标准实现,了解适合使用它的场景以及使用的效果。
学习设计模式的第二步:实际的开发中,尝试着使用这些设计模式,并反复思考和总结是否使用得当,是否需要做一些变化。
学习设计模式的第三步:再回头看设计模式的理论,有了实际的模式应用经验再看设计模式,会有不同的感悟,一边看一边结合着应用经验来思考。比如:设计模式的本质功能是什么?它是如何实现的?这种实现方式还可以在什么地方应用?如何才能把这个设计模式和具体的应用结合起来?这个设计模式设计的出发点是什么?等等。
学习设计模式的第五步:多次重复学习设计模式的第二步和第三步。也就是在实际开发中使用,然后结合理论思考,然后再应用,再思考……如此循环,反复多次,直到达到对设计模式基本掌握的水平。
2022年1月4日