PART1、 前言
TOPIC: 23种设计模式的趣谈
收获
- 初步理解各种设计模式
- 通过设计模式理解
- 封装变化、多态
- 对象间松散耦合
- 针对接口编程
- 设计出易维护、扩展、服用、灵活性好的pro
设计模式四境界
1、不会用设计模式,代码很烂
2、学了几个模式,胡乱套用而不自知
3、感觉很多模式很相似,不知差异处
4、灵活运用,无剑胜有剑
PART2、创建型设计模式
简单工厂模式
- 解决实例化哪个对象的问题
- 工厂类的方法一般用静态方法,理论上可以不用静态
- 工厂类用途:创建产品类的实例
-
UML图
- 例子:计算器
工厂模式
- UML图
- 比简单工厂好在哪?
- 简单工厂违背了开放-封闭原则
- 简单工厂每次添加功能,都要修改工厂类
原型模式
- UML图
-
在内存中克隆对象
- 减少执行new(构造函数)的次数,提高执行效率
-
使用:继承IClonable接口,调用clone方法
-
缺点:MemberWiseClone方法仅是浅复制
该方法作用与默认拷贝构造函数相同
-
实现深复制的方法
1、构造函数中调用clone
2、clone中new对象
作用于拷贝构造函数相同
-
例子:简历复印
建造者模式
- uml图
- 例子:建造小人-头-身-手-腿
- 例子:快餐流水线模式
- 将复杂对象的构建与他的表示分离,使同样的构建过程可创建不同的表示
抽象工厂模式
-
UML
- 实质是提供接口,创建一系列相关或独立的对象,而不指定这些对象的具体类。
- 与工厂模式的区别
- 抽
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
- 一个抽象工厂类,可以派生出多个具体工厂类
- 每个具体工厂类可以创建多个具体产品类的实例
- 工
- 一个抽象产品类,可以派生出多个具体产品类
- 一个抽象工厂类,可以派生出多个具体工厂类
- 每个具体工厂类只能创建一个具体产品类的实例
- 抽
- 联系MVC架构,多种类型数据库实现形式
单例模式
- uml及代码结构
- 定义
- 保证一个类仅有一个实例
- 提供一个访问他的全局访问点
PART3、行为型设计模式
策略模式
定义了算法家族,分别封装,各算法的替换不影响用户的操作
ps:c#继承父类的默认访问级别是:internal
-
简单工厂和策略模式的差别
- 简单工厂:
- instance = new Class(); Class.doSth();
- 传递相应条件得到想要的对象,然后通过该对象实现算法的操作
- 策略模式:
- instance.doSomething();
- 创建一个想要的对象,将该对象作为参数传递进策略类,通过该对象调用不同的算法
- 简单工厂:
UML图
- 例子:商场收银系统
模板方法模式
- 将不变的行为放在父类,去除子类中重复的代码
- 例子:.net中的母版模式
- 实现代码复用
观察者模式
- JAVA中的设置监听器Listener和C#中的时间响应机制都运用了该模式
- uml图
- 概念
- 定义一对多的依赖关系,让多个观察者同时监听某一主题对象
- 主题对象状态发生变化,会通知所有观察者对象,使他们能自动更新自己
- 应用场合:当一个对象的改变需要同时改变其他对象的时候
状态模式
- 定义:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
- 应用场景
- 1、一个对象的行为取决于它的状态
- 2、代码中包含大量与对象状态有关的条件语句
- UML图
- 目的:消除庞杂的条件语句
备忘录模式
- 定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态 -
uml
- 缺点:状态数据过多的话,备忘录对象会很耗内存
迭代器模式
- 定义:顺序访问聚合对象中各个元素,且不暴露内部表示
- 该模式已经内嵌于许多编程语言中了
- uml
命令模式
- uml
- 定义
- 将请求封装为对象,将发出命令与执行命令的责任分隔开
- 实现行为请求者和行为实现者的松耦合
职责链模式
- 定义
- 包含了一些命令对象和一系列的处理对象
- 处理对象形成一条链条
- 每一个处理对象决定它能处理哪些命令对象,不能处理的命令对象传递给该链中的下一个处理对象
- uml图
- 职责链的设计动机:职责链将请求的发送者和请求的处理者解耦
中介者模式
- 定义
- 用一个中介对象来封装一系列的对象交互
- 通过中介对象来封装对象之间的关系,使各个对象在不知道其他对象的具体信息情况下通过中介者对象来与之通信
- 结构图:类似星型拓扑结构
- uml图
- 缺点
- 需要知道所有的具体同事类,封装具体同事类之间相互关系
- 中介者对象变得非常复杂,系统维护起来较为困难
解释器模式
访问者模式
PART4、结构型设计模式
装饰模式
- 动态给对象添加额外职责
- 对已有功能动态添加更多功能的一种方式
- 好处:区分类的核心职责和装饰功能
- UML图
- 例子:穿衣
代理模式
- 类似回调函数
- 为外部对象提供代理以控制内部对象的访问
应用场景:
-
远程代理
- 隐藏一个对象存在于不同地址空间的事实
- 例子:webservice
`
-
虚拟代理
- 浏览器浏览网页原理
- 通过使用过一个小的对象代理一个大对象
- 就可以减少系统的开销
-
安全代理
- 控制真实对象访问时的权限
-
智能指引
- 跟智能指针shared_ptr有什么关系?
UML图
外观模式
- uml图
- 例子:炒股&炒基金
- 例子:三层架构中层与层之间使用的就是外观模式
- 例子:当大型系统代码臃肿难以维护时,可用外观模式重新定义接口,从而达到重构的目的
适配器模式
- 定义
把一个类的接口变换成客户端所期待的另一种接口
Adapter模式使原本因接口不匹配(或者不兼容)而无法在一起工作的两个类能够在一起工作。 - UML图
-
应用场景
- 两个类所做的事情相同或类似,但有不同接口时使用
-
例子:.net中的DataAdapter
- 用途:用作DataSet和数据源之间的适配器,以便检索和保存数据
- 数据源可来自SQL Server或者Oracle、mysql,数据组织形式上会有不同
- DataSet形式:实质是XML数据形式
组合模式
- 定义
- 将对象组合成树形结构以表示“部分整体”的层次结构
- 使得用户对单个对象和组合对象的使用具有一致性
- uml
- 应用场景
- 你想表示对象的部分-整体层次结构
- 忽略组合对象与单个对象的不同
桥接模式
- uml图
- 定义
- 将抽象部分与它的实现部分分离,使它们都可以独立地变化
- 实现系统可能有多角度分类,每种分类都可能变化
- 策略:多角度分离出来让他们独立变化,减少耦合
- wiki
- 把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化
- 例子
- “圆形”、“三角形”归于抽象的“形状”之下
- “画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。
享元模式
- 运行共享技术有效地支持大量细粒度对象的复用
- 极大的减少系统中对象的个数
- 享元模式由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享
- 缺点:需要区分外部状态和内部状态
- 应用场景:一个系统中存在大量的相同或者相似的对象
PART5、面向对象相关要点、法则
1、UML图的关系
- 接口继承关系
- 关联关系:类内定义关联类
- 依赖关系:传参
- 聚合关系
- 组合关系
2、单一职责原则
- 就一个类而言,仅有一个引起类变化的原因
- 软件设计要做的内容:发现职责,把职责相互分离
3、开放-封闭原则
- 软件实体(类、模块、函数)推荐扩展,不宜修改
- 对扩展开放,对更改封闭
- 多扩展、少修改
- 设计出易维护、不易出问题的最好方法
4、依赖倒转原则
- 高层模块不依赖底层模块,而都应该依赖抽象(接口)
- 抽象不依赖细节,而应细节依赖抽象
- 针对接口编程,不对实现编程
5、里氏代换原则
- 子类型必须能够替换掉它的父类型
- 即是能实现多态?
6、迪米特法则
- 两个类不必彼此直接通信的话,那么两个类不应发生直接相互作用
- 例子:IT部报到,小张,小李
- 强调松耦合
7、方法过长是坏味道