设计模式
设计模式
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
单例模式
最简单的设计模式。控制实例数目,节省系统资源的时候就可以使用
单例模式,不过要注意线程安全问题
1 | |
再根据 python 特点,可以整个装饰器来实现单例模式
1 | |
观察者模式
当一个对象被修改时,则会自动通知依赖它的对象。一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
1 | |
适配器模式
作为两个不兼容的接口之间的桥梁,使得两个原本不能互相使用的类可以一起协作
1 | |
- 适配器模式可以在保持原有的功能实现上,兼容新的需求。
- 但这只是一个
修复问题的解决方案 - 最好能在一开始就规划好接口的设计,尽量少用适配器模式。
工厂模式
提供了一种创建对象的方式,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象
1 | |
工厂方法
将生成具体产品的任务分发给具体的产品工厂,一个工厂只对应一个产品
好处就是不用通过指定类型来创建对象了
1 | |
抽象工厂
围绕一个规定好的抽象工厂,创建多个工厂,从而创建一系列的产品
1 | |
装饰器模式
允许向一个现有的对象添加新的功能,同时又不改变其结构
场景: 当前有个可以每次读一个字符的类,现在需要一次可以读一行的功能
1 | |
装饰器模式使用了组合来代替了继承,避免了子类膨胀,同时耦合度也很小。
场景: 为一个函数添加一些切面功能,例如打印日志,计算函数消耗时间
过滤器模式
1 | |
外观模式
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
1 | |
提供了一键打开一键关闭的功能
策略模式
一个类的行为或其算法可以在运行时更改
1 | |
代理模式
比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问,直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层
以下是 Cache代理
1 | |
迭代器模式
用于顺序访问集合对象的元素,不不关心集合对象的底层表示
自己实现的迭代器模式
1 | |
使用 python 自带的迭代机制
1 | |
状态模式
状态模式和策略模式非常的相似,不同点是,状态的转换是自动,无意识的,而策略模式的策略变换是手动,主观的去改变的
有一个场景,模拟食堂吃饭的不同状态和不同的行为
- 给饭
- 没付钱状态: 请先给钱
- 付了钱状态: 开始做饭,请等待
- 在做饭状态: 在做饭了,别催
- 售罄状态: 没饭了再见
- 收钱
- 没付钱状态: 付钱成功!
- 付了钱状态: 请不要重复付钱
- 在做饭状态: 在做饭了,别给钱了
- 售罄状态: 没饭了,别给了
- 退钱
- 没付钱状态: 没付钱还想退钱?
- 付了钱状态: 退款成功
- 在做饭状态: 都在做饭,不能退
- 售罄状态: 你想多了
- 发饭
- 没付钱状态: 请先去买饭
- 付了钱状态:
- 在做饭状态: 好了好了给你饭
- 售罄状态: 没饭给你了
经过简单思考一后,有可能写出以下代码:
1 | |