设计模式概述
为什么要学习设计模式?
建造狗窝和建造摩天大厦有什么区别?
一个人用些基本工具,可以随心建造,修修补补。建造的不好可以推倒重来
设计者们首先要考虑大厦的用途,然后让建筑设计师们拿出一套经得住考验的建筑图纸,紧接着去采购高质量的建筑原材料,聘请大量富有经验的建筑工人、运输司机、工地监工等 。根据设计图纸完成整座大楼的建设。
建造高质量软件和建造摩天大厦类似,需要优秀的设计
低质量软件,难以扩展,用户数量有限,运行不稳定
高质量软件,方便扩展,高并发,7*24小时正常运行
软件开发的实际情况
项目刚开始时,系统进行了初步分析设计,后面用户的需求不断发生变化,对系统不停修改,由于没有良好的设计。系统最终变成了谁都不愿意用的软件。
- 系统设计过于僵硬(加不进东西,会波及多个已有的模块)
- 系统设计过于脆弱(修改一个地方,导致感觉没有关联的模块也发生故障)
- 复用率低(代码可以用到其他地方,单代码依赖于其他东西,无法剥离,直接用了拷贝)
可复用性和可维护性是软件设计中最重要的能力,设计模式帮助我们提升这个能力
课堂讨论
如果你为西南石油大学学开发一个图书管理系统用了一年的时间,现在要为西南科技大学开发一个类似的系统需要用多长时间?
从身边的用了10年以上的软件比如微信、qq等说明可维护性的对软件工程的重要性
老子,善为士者不武
士-软件系统设计师
武-对软件系统的大规模修改
设计模式是软件开发中的内功心法
从1995年至今,无论是在大型API或框架(如JDK\net Frammework等)、轻量级框架(Struts、Spring、Hibernate、Junit)等,还是应用软件的开发中,设计模式都得到了广泛的应用
天下有道,却走以马以粪
天下无道,戎马生于效
天下太平,好的跑马却在田间耕作;当天下无道时,战马在战场上生出小驹
系统设计得好,软件维护不困难,代码高手无法发挥作用
软件设计低劣、维护性差,代码高手必须连续作战
设计模式产生的背景
模式的诞生与定义
- 模式起源于建筑业而非软件业
- 模式之父-美国加利福尼亚大学环境结构中心研究所所长
- 253个建筑和城市规划模式
- Context(模式适用的前提条件)
- Theme或probelem(在特定条件下要解决的目标问题)
- Solution(对目标问题求解过程中各种物理关系的记述)
模式的诞生与定义
- Alexander给出了关于模式的经典定义:每个模式都描述了一个在我们环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的解决方案,无需再重复相同的工作。
- A patter is a solution to a problem in a context
- 模式就是在特定环境中解决问题的一种方案
软件模式
- 1990年,软件工程界开始关注Alexander等在这一住宅、公共建筑与城市规划领域的重大突破
- 四人组(GOF),他们在1994年归纳发表了23中在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟
设计模式概念与意义
什么是模式?
从字面上理解,模,就是模型、模板的意思,式就是方式、方法的意思。综合起来,所谓模式就是可以作为模型或模板的方式或方法。再简单点说就是可以用来作为样板的方法或方式,类似于大家所熟悉的范例
这两个建筑有什么相同的地方?身边还有没类似例子?
patter模式其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式
模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你做出一个优良的设计方案,达到事半功倍的效果。
- 中国传统建筑:阁、亭、桥
- 中国武术:招术、套路
- 书法:行书笔法、草书笔法、隶书笔法
- 中国画:勾勒、点绘、破魔
软件设计模式(design patter)是一套被反复使用、多数人知晓的经过分类编目的、代码设计经验的总结。是指在软件开发中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案。
到药店买感冒药,这个感冒药就是设计模式的一个很好体现
- 经过验证的:药品上市前,会有大量的验证和实验以保证药品的安全性
- 特定环境下:这些药品是针对人的、不是针对其他动物的
- 重复出现的:正是因为感冒会重复出现,研制药品才是有意义的
设计模式是解决方案,解决方案就是设计模式呢?
软件模式
软件模式就是与具体的应用领域无关,在模式发现过程中需要遵三大规律,即只有经过三个以上不同类型的系统的校验,一个解决方案才能从候选模式升格为模式
设计模式产生的概念和意义
软件模式等同于一定条件下出现的问题的以及解法,软件模式的基础结构由4个部分构成:
- 问题描述
- 前提条件
- 解法
- 效果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6fHW6ba8-1672564587390)(C:\Users\xiaozhao\AppData\Roaming\Typora\typora-user-images\image-20230101164948830.png)]
软件模式四要素
- 模式名称:用一两个词来描述模式的问题、解决方案和效果
- 问题:描述了应用该模式的场合、情形
- 解决方案:解决问题的方法、步骤或途径
- 效果:描述了模式应用的效果及使用模式应权衡的问题
23种设计模式
GOF设计模式的分类
- 根据目的准则分
- 创建型模式:是创建对象而不是直接实例化对象,使程序在判断给定情况下创建哪一个对象时更为灵活
- 结构型模式:怎样安排系统内的各个对象,使其分布合理、易于理解、管理和维护
- 行为型模式:定义系统内对象间的交互通信
- 根据作用范围分
- 类模式:处理类和子类之间的关系(静态)
- 对象模式:处理对象之间的关系,在运行时可以变化(动态)
范围 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法模式 | 适配器模式(类) | 解释器模式,模板方法模式 |
对象模式 | 抽象工厂模式、建造者模式、原型模式、单例模式 | 适配器模式(对象)桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 | 职责链模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 装状态模式 策略模式 访问者模式 |
创建型模式
- 抽象工厂模式(Abstract Factory)
- 建造者模式
- 工厂方法模式
- 原型模式
- 单例模式
结构型模式
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰模式(Decorate)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 代理模式(Proxy)
行为型模式
- 职责链模式(Chain of Responsibility)
- 命令模式(Command)
- 解释器模式(Interpreter)
- 迭代器模式(Interator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Stragety)
- 模板方法模式(Template Method)
- 访问者模式(Vistor)
如何学习设计模式?