设计模式是项目编程必须掌握的技巧,可以让你的项目结构层次清晰,减少代码的冗余,同时也是面试过程中避免不了的话题,无论python,还是Java都有二十来套设计模式,但是大同小异。这两天看python 类继承时,顺便把常用的设计模式分为三类整理了一下,按创建型模式、结构型模式、行为型模式三大类来介绍。老规矩先上图,用一两句话总结每个模式的特点,便于区分记忆,具体例子demo参考其它博客。
没有什么是一张图解决不了的,如果有就再画一张
目录
1. 创建型模式
1.1 单例模式
目的:确保某一个类只有一个实例存在
场景:客户端的 AppConfig,避免浪费内存资源
1.2 工厂模式
通过固定的接口而不是直接去调用类的实例化方法来获得一个对象实例,
隐藏了实例创建过程的复杂度,解耦了生产实例和使用实例的代码,降低了维护的复杂性
主要模式
简单工厂:允许固定接口创建对象,用户只关心哪种类型的实例被创建,不必关心其初始化过程
工厂方法:在简单工厂的优点上进行改进,将具体的创建工作交给相应子类去做,使得系统更高效扩展
抽象工厂:在工厂方法的基础上扩展了一个工厂对多个产品创建的支持
1.3 建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
相关模式:思路和模板方法模式很像,模板方法是封装算法流程,对某些细节,
提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现
1.4 原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
本质:克隆对象
浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝的对象和源对象只是名称相同,但是他们共用一个实体
深拷贝:对对象实例中字段引用的对象也进行拷贝
2. 结构型模式
2.1 适配器模式
一种接口适配技术,它可通过某个类来使用另一个接口与之不兼容的类,运用此模式,两个类的接口都无需改动
2.2 装饰器模式
装饰器是 python 的一种语法糖,本质是一个可调用的对象,其参数是一个被装饰的函数。装饰器可能会处理被装饰的函数并返回,或者将其替换成另一个函数或对象
内部装饰器
@staticmethod: 类似实现了静态方法 注入以后,可以直接 : 类名.方法
@property:经过property装饰过的函数 不再是一个函数,而是一个property,类似实现get,set方法
@classmethod: 与staticmethod很相似,貌似就只有这一点区别:
第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等
闭包函数
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用
2.3 外观模式
外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式
场景:在家观看多媒体影院时,更希望按下一个按钮就能实现影碟机,电视,音响的协同工作,而不是说每个机器都要操作一遍
2.4 享元模式
运用共享技术有效地支持大量细粒度的对象
划分:
内部状态:享元对象中不会随环境改变而改变的共享部分
外部状态:随环境改变而改变、不可以共享的状态就是外部状态
2.5 模型视图控制器
MVC框架
2.6 代理模式
代理模式就如同一个"过滤器",它不实现具体功能,具体功能由被调用的实体来实现,
代理实现的是对调用的控制功能,它能够允许或者拒绝调用实体对被调用实体的访问
类型
远程代理
虚拟代理
安全代理
智能代理
3. 行为型模式
3.1 命令模式
将一个请求封装成一个对象,从而可以使用不同的请求将客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能
命令角色,具体命令角色,接收者角色,请求者(调用者)角色(Invoker),客户角色(Client)
特点:
优点:1、低耦合:调用者和接收者之间没有什么直接关系,二者通过命令中的execute接口联系
2、扩展性好:新命令很容易加入,也很容易拼出“组合命令”
缺点:使用命令模式可能会导致某些系统有过多的具体命令类
应用场景:在大多数饭店中,当服务员已经接到顾客的点单,录入到系统中后,根据不同的菜品,会有不同的后台反应
3.2 解释器模式
开发者自定义一种“有内涵”的语言(或者叫字符串),并设定相关的解释规则,输入该字符串后可以输出公认的解释,或者执行程序可以理解的动作
应用场景: SQL 解析、符号处理引擎
3.3 观察者模式
目的是加强发布者和订阅者之间的耦合拆解,并在运行时可以很容易的添加或删除订阅者
场景:MVC 开发模式中,发布者为M(model),订阅者为V(view),假如两个 view 都用了同一个 model,一旦 model 被修改,这两个 view 都要更新
3.4 策略模式
它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户
应用场景:商场活动,针对现金、打折、正常收费,根据场景传入上下文不同的策略实例
实质为字典匹配模式
3.5 模板模式
跟建造者模式差别:建造者模式是将对象的构建和表示分离,相同的构建生成不同的表示对象,
而模板方法是将定义的算法或流程中的部分环节推迟到子类中实现算法或流程的可变
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义
该算法的某些特定的步骤。子类实现的具体方法叫作基本方法,实现对基本方法高度的框架方法,叫作模板方法
使用场景:某超类的子类中有公有的方法,并且逻辑基本相同,可以使用模板模式。必要时可以使用钩子方法约束其行为
3.6 责任链模式
用于让多个对象处理一个请求时,或者用于预先不知道由哪个对象来处理某种特定请求时
特点:
优点:将请求者与处理者分离,请求者并不知道请求是被哪个处理者所处理,易于扩展
缺点:如果责任链比较长,若业务出现问题,比较难定位是哪个处理者的问题
应用场景:公司请假审批天数不同分配给不同经理;
实质为链表形式
3.7 状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,
把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化例:不同时间段干不同的事
【参考】
https://www.cnblogs.com/tangkaishou/p/9246353.html
码字不易,转载请说明~~
分享知识,传播快乐
来都来了,点个赞呗~~