前言
因为一些不可控的原因,放弃了考研,准备下半年出去找工作实习。正好开了设计模式的课,之前自己零零总总地学了一部分,没能及时总结,以至于现在忘了一大半了。想着设计模式还是挺重要的,就一时兴起开了这个分类,记录一下自己的学习进度和关键知识点。内容多出自清华大学出版社的《面向对象与设计模式》一书(自学时使用的是《大话设计模式》,闲着没事就翻两页,非常适合设计模式的学习)。
设计模式的定义
GOF在《设计模式》关于设计模式的经典定义:“每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次一次地使用该方案而不必做重复劳动。”
一言以蔽之:“设计模式是在前人的经验上总结出来的,只针对单一的某一类问题的最佳解决方案。”(个人观点,不喜轻喷)
记录一个设计模式需要有4个基本要素。
- 名称:一个高度概括该模式的本质的名称,便于交流使用和统一术语。
- 问题:解释该模式与问题之间的关联,描述该模式的使用时机和使用环境。
- 方案:描述模式的组成部分,各部分的职责,各部分之间的关系和协作方式。
- 效果:描述使用该模式对系统带来的好处。
例如:(出自书中)
- 名称:中介者。
- 问题:用一个中介者来封装一系列的对象交互。中介者模式使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 方案:中介者(Mediator)接口、具体中介者(ConcreteMediator)、同事(Colleague)、具体同事(ConcreteColleague)。
- 效果:减少了子类的生成,将各个同事解耦,简化了对象协议,控制集中化。
设计模式的重要性
设计模式的目的不是针对软件设计和开发中的每个问题都给出解决方案,而是针对某种特定环境中通常都会遇到的某种软件开发问题给出可重用的一些解决方案。
学好设计模式有什么用?
听上去很厉害,像个高端码农。
一是在遇到相同问题是,直接使用现成的设计模式,是最直接、最有效的解决方法。能帮我们节省大量的时间,以及省去重复代码。(关键是如果你完全没接触过设计模式,有时候你根本意识不到到其中隐藏的问题以及有更好的解决方法)
二是能让我们更加深刻理解面向对象的设计思想,有利于使用面向对象的思想解决问题。
三是为之后接触学习框架打下基础(我是先接触的框架,被虐到半死不活,好歹是明白了个七七八八。然后看的设计模式,才发现技能顺序点反了。。)
设计模式的使用
- 正确使用
当确认所遇到的问题刚好适合使用某个模式时,**(大前提)**就可以将该模式应用到系统设计中。毕竟该模式已经被公认是解决该类问题的成功方案。能提高系统的可维护性、可扩展性和复用性。(同时,让其他人更容易看懂你的代码) - 避免教条
一个模式只是成功解决某个特定问题的设计方案,完全可以修改模式中的部分结构以符合设计要求。(不要生搬硬套) - 避免乱用
不是所有的设计中都需要使用模式,模式是总结出来的,不是说非用不可。
总结一句话,就是不要强求,强求是没有好下场的。(说的是使用设计模式)
设计模式分类
GOF根据模式的目标将模式分为3个类目:创建型、行为型和结构型。
- 行为型模式
涉及怎样合理地设计对象之间的交互通信,以及怎样合理地为对象分配职责,让设计富有弹性、易维护、易复用。
- 结构型模式
涉及如何组合类和对象以形成更巨大的结构,和类有关的结构型模式涉及如何合理地使用继承机制(毕竟继承属于高耦合,不敢随便使用,容易被骂),和对象有关的结构型模式涉及如何合理地使用对象组合机制。
- 装饰模式
- 组合模式
- 适配器模式
- 外观模式
- 代理模式
- 享元模式
- 桥接模式
- 创建型模式
涉及对象的实例化,这类模式的特点是:不让用户代码依赖于对象的创建或排序方法,避免用户直接使用new运算符创建对象。
- 工厂方法模式
- 抽象工厂模式
- 生成器模式
- 原型模式
- 单件模式
注:第一篇博客,基本上就是把书上的东西总结一下,自己的理解少得可怜,以后会尽可能改善这种情况的。