软件设计原则
(1)单一职责:一个模块只有一个职责
(2)开闭原则:对新需求,无需修改逻辑,只需扩展即可。
(3)里氏替换:用基类设计的流程,子类可以在其上畅通的运行。
(4)依赖倒转:模块间不依赖模块的细节,只依赖模块的抽象。
(5)接口隔离:接口间不依赖。
(6)迪米特法则:只需知道很少的信息,即可调用对方。
(7)合成复用法则:多用组合,少用继承。
设计模式,是尽可能满足设计原则的、适用于特定场景的、相对稳定的软件架构。
1. 单例模式
类实例有且只有一个。根据实例的创建时机,又可分为懒汉式和饿汉式。
2. 工厂模式
简单工厂
(1)只有一个工厂。
(2)工厂可以生产不同产品。
(3)客户告诉工厂生产什么即可。
工厂方法
(1)有多个工厂。
(2)每个工厂只能生产一种产品。
(3)客户需要先选择工厂,然后通知其生产即可。
复杂工厂模式
(1)有多个工厂。
(2)每个工厂可以生产多种产品。
(3)客户需要先选择工厂,然后告诉工厂生产什么。
模式PK:
(1)当复杂工厂只有一个工厂时,复杂工厂退化为简单工厂。
(2)当复杂工厂的每个工厂只能生产一种产品时,复杂工厂退化为工厂方法。
3. 代理模式
用户只需告诉代理需求,无需关注代理如何完成。
4. 策略模式
用户告诉策略者自己的需求倾向,策略者根据倾向,给出不同的策略。
模式PK:
(1)代理模式侧重于屏蔽完成工作的细节。
(2)策略模式侧重于策略查询。
(3)代理模式通常也做着策略模式的活。
5. 观察者模式
(1)观察者把自身的需求和“联系方式”告知信息源。
(2)信息源监测到所需的信息有变化时,告知对应的观察者。
6. 装饰者模式
当有新需求时,在原有基础上,“装饰”上新的元素。
7. 适配器模式
适配器可以将不同的接口转为同一种接口。
8. 命令模式
(1)用户只需告诉控制器做什么。
(2)控制器按着约定的格式,向对应设备发送命令包。
9. 外观模式
将原有的复杂的用法封装为简洁的用法。
10. 模板方法
(1)先设计一个模板。
(2)公共部分固定化在模板里。
(2)可定制部分先定义好接入要求,然后在模板中预留接入接口。
11. 迭代器
(1)每个迭代器元素中均有一个适配层,屏蔽不同对象的差异。
(2)迭代器元素相连,通过 next() 接口可获取下一个迭代器元素。
模式PK:
把适配器模式连接起来,就是迭代器模式。
12. 组合模式
(1)每个元素均有一个适配器,以屏蔽不同对象的差异。
(2)同等级别的元素放在同一级上。
(3)低一级的元素,挂在高一级的元素上。
模式PK:
迭代器将适配器模式“串”起来,而组合模式是将适配器模式以“树形”结构连接。
13. 状态机
(1)有多个状态。
(2)每个状态有所能支持的操作。
(3)每个状态被“操作”后,跳到新的状态(也可能跳回自身)。
14. 生产者和消费者模式
(1)只要队列没有满,生产者只管向队列里放。
(2)只要队列没有空,消费者只管从队列里取。
(3)生产者和消费者无需直接通信。
15. MVC 模式
(1)用户操作 View。
(2)View 通知 Control 模块:用户有操作。
(3)Control 模块改变 View 的显示,同时告知 Model 模块:用户有操作。
(4)Model 模块处理完用户的操作后,通知 View:我处理完了。
(5)View 模块向 Model 模块发出请求:把你的状态信息给我。