第 1章 设计模式概述
概念
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
简介
设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。
设计模式的重要性
- 软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990 年代从建筑设计领域引入到计算机科学的
- 大厦VS 简易房
- 拿实际工作经历来说, 当一个项目开发完后,如果客户提出增新功能,怎么办?。(可扩展性,使用设计模式,软
件具有很好的扩展性) - 如果项目开发完后,原来程序员离职,你接手维护该项目怎么办? (维护性[可读性、规范性])
- 目前程序员门槛越来越高,一线IT 公司(大厂),都会问你在实际项目中使用过什么设计模式,怎样使用的,解决了什么问题。
- 设计模式在软件中哪里?面向对象(oo)=>功能模块[设计模式+算法(数据结构)]=>框架[使用到多种设计模式]=>架构[服务器集群]
- 如果想成为合格软件工程师,那就花时间来研究下设计模式是非常必要的.
设计模式的目的
编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好
- 代码重用性(即:相同功能的代码,不用多次编写)
- 可读性(即:编程规范性, 便于其他程序员的阅读和理解)
- 可扩展性(即:当需要增加新的功能时,非常的方便,称为可维护)
- 可靠性(即:当我们增加新的功能后,对原来的功能没有影响)
- 使程序呈现高内聚,低耦合的特性
分享金句:
-
设计模式包含了面向对象的精髓,“懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要”
-
Scott Mayers 在其巨著《Effective C++》就曾经说过:C++老手和C++新手的区别就是前者手背上有很多伤疤
第 2 章设计模式七大原则
设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础(即:设计模式为什么这样设计的依据)
设计模式常用的七大原则有:
-
单一职责原则
-
接口隔离原则
-
依赖倒转(倒置)原则
-
里氏替换原则
-
开闭原则
-
迪米特法则
-
合成复用原则
设计模式七大原则:第二部分(依赖倒转原则,依赖关系传递的三种方式,里氏替换原则)
设计模式七大原则:第三部分(开闭原则,迪米特法则,合成复用原则)
第 3 章UML类图
第 4 章设计模式概述
掌握设计模式的层次
-
第1 层:刚开始学编程不久,听说过什么是设计模式
-
第2 层:有很长时间的编程经验,自己写了很多代码,其中用到了设计模式,但是自己却不知道
-
第3 层:学习过了设计模式,发现自己已经在使用了,并且发现了一些新的模式挺好用的
-
第4 层:阅读了很多别人写的源码和框架,在其中看到别人设计模式,并且能够领会设计模式的
精妙和带来的好处。 -
第5 层:代码写着写着,自己都没有意识到使用了设计模式,并且熟练的写了出来。
设计模式介绍
-
设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
-
设计模式的本质提高软件的维护性,通用性和扩展性,并降低软件的复杂度。
-
<<设计模式>> 是经典的书,作者是Erich Gamma、Richard Helm、Ralph Johnson 和John Vlissides Design(俗称“四人组GOF”)
-
设计模式并不局限于某种语言,java,php,c++ 都有设计模式.
设计模式类型
设计模式分为三种类型,共23 种
创建型模式:
概念
前面讲过,社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和对象的使用分开也就成为了必然趋势。因为对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。这里有6个具体的创建型模式可供研究,它们分别是:
功能:类的创建
种类
单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
单例模式八种方式(饿汉式,懒汉式,双重检查,静态内部类,枚举)
工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)(图解+源码)
结构型模式:
概念
在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低,这里有7个具体的结构型模式可供研究,它们分别是:
功能: 组合代替、类与类之间的关系
种类
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:
概念
在对象的结构和对象的创建问题都解决了之后,就剩下对象的行为问题了,如果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提高,这里有11个具体的行为型模式可供研究,它们分别是:
功能:关注对象与行为的分离、就是要把行为分离到类里面
种类
模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)。
责任链模式(职责链模式)(Chain of Responsibility Pattern)
三者之间的联系:
创建型模式为其他两种模式使用提供了环境,好比VS软件提供了.net环境和操作平台,是各种编程语言能随心所欲地在这个平台上编译执行;
结构型模式侧重于接口的使用,它做的一切工作都是对象或是类之间的交互,提供一个门,成就一个你来我往,协同合作的地球村;
行为型模式顾名思义,侧重于具体行为,所以概念中才会出现职责分配和算法通信等内容。
注意
不同的书籍上对分类和名称略有差别
设计模式在框架或项目中源码分析的说明
对某个设计模式源码分析的说明
-
为了让同学们可以更加深入的理解某个设计模式,我们会找该模式在spring, springMVC, MyBatis 或者 JDK 源码 中的应用
-
有一点需要说明:设计模式是程序员在编程中,有意或者是无意使用到的(也不是所有的程序员都学习过设计模式),并且同一种设计模式实现方式也不是100%的一样,设计模式主要是提高程序的扩展性,可读性,可维护性、规范性。
-
所以在我们讲某个设计模式在源码框架中使用时,和我们的标准的设计模式写法可能会有些出入,比如组合模式 Component 可以是抽象类,接口,也可以是一个实现类, 我们讲源码时(JDK HashMap源码),Component 就可能不一样
-
对于框架源码,源码中部分使用了A设计模式,还部分使用了B设计模式,也是有可能的,也就是说设计模式是可以结合使用的
-
.因为设计模式主要是一种编程思想,既然是思想,具体实现方式,就不可能100%的一样(当然,程序的设计结构基本是一样的)
-
所以,提醒大家我们学习设计模式时,(包括看源码分析),要抓住本质,就是使用这个设计模式到底带了了什么好处? 是 扩展性提高了,还是更加规范了,这样我们才能领会设计模式的精妙之处。