大话设计模式
第1章 代码无错就行?——简单工厂模式
面向对象:活字印刷的例子(可维护,可复用,可扩展,灵活性好)
实现计算器:
- 直接实现,简单粗暴
- 让业务逻辑跟界面逻辑分开,耦合度降低(分装)
- 面向对象的三大特性:封装,多态,继承
- 加减乘除运算方法分开(多态)
- 加减乘除运算类分开(简单工程模式)
UML类图
第2章 商场促销——策略模式
超市打折:
直接实现,简单粗暴
业务逻辑跟界面逻辑分开(封装)
打五折,满五百减二百(简单工厂)
简单工厂只解决了对象的创建问题,如果需要经常更换打折额度,岂不是要频繁改动工厂?
满一百送十积分(策略模式)
将判断过程移走(策略模式+简单工厂)
对比 | 简单工厂模式 | 策略模式 |
---|---|---|
核心思想 | 关注对象的创建过程 | 关注定义可替换的算法 |
应用场景 | 用于对象的创建和管理 | 用于定义算法族 |
目的和结构 | 降低对象创建复杂性 | 定义策略多样性 |
使用时机 | 在对象创建时被调用 | 在对象使用时被调用 |
灵活性和可扩展性 | 容易已你如新产品类型,可能增加工厂复杂性 | 容易引入新策略,不影响已有策略实现 |
第3章 拍摄UFO——单一职责原则
拍摄UFO:功能太多太杂 –> 就一个类而言,应该仅有一个引起它变化的原因
俄罗斯方块设计:将界面与游戏逻辑(下落、旋转、碰撞等)分离开
第4章 考研求职两不误——开放-封闭原则
开-闭:软件实体(类、模块等)应该可以扩展,但不能修改
过犹不及,拒绝不成熟的抽象
第5章 会修电脑不会修收音机?——依赖倒转原则
抽象不应该依赖细节,细节应该依赖于抽象,针对接口编程,不要对实现编程
高层模块不应该依赖低层模块,两个都应该依赖抽象
里氏代换原则:子类型必须能够替换掉它们的父类型 –> 子类能够添加新的行为
第6章 穿什么有这么重要?——装饰模式
搭配衣服:
- 直接实现,简单粗暴
- 服饰类抽象出来
- 装饰模式:动态地给一个对象添加一些额外的职责
Component:对象接口 ConcreteComponent:具体对象 Decorator:装饰抽象类
第7章 为别人做嫁衣——代理模式
追求娇娇:
- 没有代理对象
- 只有代理对象
- 符合实际
代理模式的应用场景:远程代理;虚拟代理;安全代理;智能指引
第8章 雷锋依然在人间——工厂方法模式
计算器实现:
- 简单工厂实现(加减乘除继承工厂)
- 工厂方法实现(各建一个具体工厂)
- 简单工厂的好处:去除了与具体产品的依赖;但需要加一个算法时,需要修改工厂类,违反开闭原则
- 雷锋做好事实现
第9章 简历复印——原型模式
简历类:
- 直接实现,简单粗暴
- 原型模式(从一个对象创建另一个可定制的对象)
- 浅复制:只有相同值,引用仍指向原对象;深复制:把引用的对象都复制一遍,引用指向新对象
- 工作经历也实现clone方法(深复制)
第10章 考题抄错会做也白搭——模板方法模式
手抄题,题目抄错–>考试试卷,标准化
抄题目:
- 甲乙两人抄试卷,直接实现,简单粗暴
- 代码提炼(试卷父类)
- 模板方法(重写(答案)虚方法,父类建立所有重复的模板)
- 特点:把不变行为搬到父类,去除子类中的重复代码
第11章 无熟人难办事?——迪米特法则
迪米特法则:最少知识原则,强调类之间的松耦合,只需要认识IT部主管就行
第12章 牛市股票还会亏钱?——外观模式
股民炒股:
- 直接实现,简单暴力
- 基金版(外观模式)
- 为子系统的一组接口提供一个一致的界面,什么时候使用:设计初期,开发阶段,后期维护
第13章 好菜每回味不同——建造者模式
建造小人:
- 直接实现,简单粗暴(可能少了一条腿)
- 分离类(但解决不了问题)
- 过程稳定(头手脚)细节不同(高矮胖瘦)
Builder类,ConcreteBuilder具体实现类,Director指挥者类(用来控制建造过程,隔离用户与建造过程的关联)
第14章 老板回来,我不知道——观察者模式
观察老板:
- 前台 –> 同事(相互耦合)
- 解耦实践一(观察者抽象出来了)
- 解耦实践二(通知者也抽象出来了)
- 特点:依赖倒转,解除耦合
- 事件委托:去掉抽象观察者,将具体观察者类的更新委托给通知者类
第15章 就不能不换DB吗?——抽象工厂模式
更换数据库:
最基本的数据访问程序
使用工厂方法模式(一旦更改功能需要改动的地方很多,表类也很多)
使用抽象工厂模式AbstractProductA AbstractProductB AbstractFactory(添加新表麻烦)
好处:易于交换产品系列;创建实例过程与客户端分离
简单工厂改进抽象工厂(添加新工厂麻烦)
反射+抽象工厂
反射+配置文件
第16章 无尽加班何时休——状态模式
一天工作状态变化:
- 面向过程,直接用方法实现
- 分类版(工作类,客户端):方法过长,判断过多
- 状态模式:可以把复杂的判断逻辑简化 State抽象状态类,ConcreteState具体状态类,Context类维护一个ConcreteState的实例,定义当前状态
- 工作状态——状态模式版