文章目录
大话设计模式 读书笔记
易维护、易扩展、易复用、灵活多样
- 大学时读过的书,当时更多是觉得内容生动有趣,对其内容的理解并不到位。究其原因,上学时并没有中大型项目的合作开发经验,编程更多是写小的功能还有刷算法题,所以对代码结构没有非常具体的思考。但这本书仍在我脑子里留下了不浅的印象,参加工作后经常能在项目代码中看到它的影子,或是闻到一些代码的坏味道。最近重新通读了一下,仍然有觉得模糊的部分。写下这篇内容索引,便于回忆,希望以后能更加透彻的理解和应用这些思想。
第一章
- 业务封装降低耦合
- 程序分离的必要性: 将加减乘除分离为四个类,避免修改加法时需要整个计算类的代码,降低风险;
- 简单工厂: 提供一个接口,接受"+-*/"参数,实例化相应对象,并返回父类;(简单工厂将实例化从客户端分离出来)
UML类图
2 策略模式
类不是越多越好,划分类是为了封装,而分类的基础是抽象;具有相同属性和功能的对象的抽象集合才是类;
策略模式封装了变化
3 单一职责原则
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因
4 开放-封闭原则
开放-封闭原则 对扩展开放,对修改封闭
面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有代码
5 依赖倒转原则 里氏代换原则
依赖倒转原则:高层模块不应该依赖底层模块,两个都应该依赖抽象; 抽象不应该依赖细节,细节应该依赖抽象。
里氏代换原则: 子类型必须能够替换掉它们的父类型
6 装饰模式
装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活;
为已有功能动态地添加更多功能的一种方式; 如果新功能不是类的核心职责,只在某种特定情况下才会执行则可以使用装饰模式;
好处:有效的把类的核心职责和装饰功能分开了;而且可以去除相关类中重复的装饰逻辑;
具体实现:Decorator类继承需要装饰的Component基类,且包装(含有)该类的对象; A、B、C三个具体的装饰类就可以互相包含,实现指定顺序的"装饰";
7 代理模式
代理模式:为其他对象提供一种代理以控制对这个对象的访问
8 工厂方法模式
**工厂方法模式:**定义一个用于创建对象的接口,让子类决定实例化那一个类了;
9 原型模式
**原型模式:**用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象; (.NET在System命名空间中提供ICloneable接口,其中唯一一个方法Clone(),实现这个接口就可以完成原型模式)
10 模板方法模式
模板方法模式:定义一个操作中的算法的骨架,将一些步骤延迟到子类中;模板方法使得可以不改变一个算法的结构即可重定义该算法的某些特定步骤; (简单来说就是把不变的行为统一放到父类中)
11 迪米特法则
**迪米特法则(最少知识原则)😗*如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用;如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调研;
12 外观模式(Facade)
**外观模式(Facade)😗*为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用;
13 建造者模式
**建造者模式:**将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
观察者模式
观察者和通知者的抽象,使得他们互相不依赖各自的细节,而是依赖各自的抽象;
14.9 事件委托
delegate void EventHandler();//委托像是声明了一个特殊的类
class A
{
public event EventHandler Update;//这个"特殊类"的实例
public void Notify()
{
Update();
}
}
...
A a = new A();
a.Update += new EventHandler(func1);//一个委托可以搭载多个方法,所有方法依次唤醒
a.Update += new EventHandler(func2);//两个函数要有相同的参数列表和返回值类型
15 抽象工厂模式
抽象工厂模式: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类;
简单工厂使用反射技术去除switch、if,解除分支判断带来的耦合
16 状态模式
**状态模式:**当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类;
17 适配器模式(Adapter)
**适配器模式:**将一个类的接口转换成客户希望的另一个接口;Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
18 备忘录模式
19 组合模式
20 迭代器模式
21 单例模式
双检锁 懒汉 饿汉
22 合成/聚合复用原则与桥接模式
合成/聚合复用原则: 尽量使用合成/聚合,尽量不要使用类继承;
桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化;
理解: 将一个抽象类的多种分类方式分离,使得它们可以独立变化,减少耦合;
23 命令模式
24 职责链模式
25 中介者模式
减少了交互者之间的复杂性,但增加了中介的复杂性
26 享元模式
共享对象减少开销(连接池?)
27 解释器模式
解释器模式: 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子;
28 访问者模式
**访问者模式:**表示一个作用于某对象结构中各个元素的操作;它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作;
适用于数据结构相对稳定的系统; 新增操作很容易,增加新元素困难