设计模式
2021-10-27 08:59:21 39 举报
AI智能生成
23种设计模式整理图
作者其他创作
大纲/内容
基本要素
模式名称
问题
应该在什么时候使用设计模式
解决方案
描述了设计模式的组成部分,以及这些组成成分之间的相互关系,相互职责和协作方式
效果
描述了模式应用的效果以及在使用模式时应权衡的问题
面向对象设计原则
单一职责原则
概念
一个对象只应该包含单一的职责,并且该职责被完整的封装在一个类中
理解
一个类只处理一个业务的逻辑,其他的业务逻辑采用组合的方式引入。
开闭原则
概念
软件实体应当对扩展开放,对修改关闭
理解
设计程序的时候要考虑需求的变化,尽可能的在不动原来的代码逻辑的基础上进行拓展。其中抽象化是实现开闭原则的关键
里氏代换原则
概念
所有引用基类的地方必须能透明的使用其子类的对象
理解
凡是能使用父类的地方都可以使用子类,这是实现开闭原则的重要原则。并不是子类不能改变父类的属性,而是在方法定义的时候尽量使用父类类型,在使用时可以放心的使用子类来传入,达到开闭的目的。
依赖倒转原则
概念
高层模块不应该依赖低层模块,他们都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象
理解
在程序中的参数传递或者关联关系中尽量使用类的抽象层而不是具体的实现类。这样更容易拓展,实现开闭原则。
接口隔离原则
概念
客户端不应该依赖那些他不需要的接口
理解
接口尽量的小并且职责单一,否则拓展的时候实现接口会实现很多不需要的方法,不灵活
合成复用原则
概念
优先使用对象组合,而不是继承来达到复用的目的
理解
区分场景使用继承或者组合,has-A,一个角色里面的一个功能,就用组合。IS-A,一个功能是另一个的一种,就用继承
迪米特法则
概念
每一个软件单位对其他单位都只有最少的只是,而且局限于那些与本单位密切相关的软件单位
理解
一个类中尽可能少的和其他类关联,如果需要其他类的业务,尽量使用第三者来进行传递
结构型模式
适配器模式
概念
将一个类的接口转换成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作
角色
目标抽象类
适配器类
适配者类
分类
类适配器
对象适配器
理解
为目标类写一个子类,在这个子类中关联或者实现要适配的类,并且定义新方法调用要适配的方法
如果不想实现某个接口里面所有的方法,可以写一个抽象类实现这个接口。然后继承这个抽象类,重写需要的方法
桥接模式
概念
将抽象部分与它的实现部分解耦,使得两者能够独立变化
角色
抽象类
扩充抽象类
实现类接口
具体实现类
理解
当一个场景有两个独立变化的维度,可以通过继承的方式解决一个变化维度,然后用组合的方式维护另一个维度的父类
组合模式
概念
组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象
角色
抽象构件
叶子结构
容器构件
理解
当需要处理带有层级结构的场景时,可以考虑一下组合模式,最顶层的叶子端真正的处理,而枝干端不真正处理,而是组合抽象叶子类,调用叶子类的实现方法
装饰模式
概念
动态的给一个对象增加一些额外的职责。就扩展功能而言装饰模式提供了一种比使用子类更加灵活的替代方案
角色
抽象构件
具体构件
抽象装饰类
具体装饰类
外观模式
概念
为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
角色
外观角色
子系统角色
享元模式
概念
运用共享技术有效的支持大量细粒度对象的复用
角色
抽象享元类
具体享元类
非共享享元类
享元工厂类
代理模式
概念
给某一个对象提供一个代码或者占位符,并由代理对象来控制原对象的访问
角色
抽象主题角色
代理主题角色
真实主题角色
分类
远程代理
为一个位于不同地址空间的对象提供一个本地的代理对象,这个不用的地址空间可以再一台主机上,也可以在另一台主机上
虚拟代理
如果需要创建一个需要消耗内存比较大的对象,可以先创建一个消耗相对较小的代理对象,真实对象只在需要时才会被真正创建
保护代理
控制一个对象的访问权限,可以给不同的用户提供不同级别的使用权限
缓冲代理
为某一个目标操作的结果提供临时的存储空间,以便多个客户可以共享这些结果
智能引用代理
当一个对象被引用时提供一些额外的操作,例如将对象被调用的次数记录下来
概念
设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的关系
创建型模式
简单工厂模式
概念
定义一个工厂类,它可以根据参数不同返回不同的实例,被创建的实例通常都有共同的父类
角色
工厂角色
抽象产品角色
具体产品类
优缺点
优点
客户端可以免除直接创建对象的职责,仅仅消费产品
客户无需知道具体的类所对应的的参数即可创建出类,易于操作
缺点
工厂类所负担的逻辑太重,一旦挂掉就全完了
会增多系统内类的个数
系统扩展困难,引入新的产品类就得修改工厂的代码
特点:在工厂类中决定创建产品的类型
UML图
工厂方法模式
概念
定义一个用于创建对象的借口,但是让子类决定将哪个类实例化,工厂方法模式让一个类的实例化延迟到其子类
角色
抽象产品
具体产品
抽象工厂
具体工厂
优缺点
优点
用户只需要知道所需产品的工厂,无需知道创建细节,甚至无须知道产品类的类名
能够让工厂自助确定创建何种产品对象,如何创建封装在工厂内部
加入新的产品时无须修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品。
缺点
增加产品时需要写新的工厂和产品类,类数量增加。
在客户端都使用抽象层进行定义,增加了系统的抽象性和理解难度
特点:在客户端中决定创建产品的类型
抽象工厂模式
概念
提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类
角色
抽象工厂
具体工厂
抽象产品
具体产品
优缺点
解决了同一组,同一系列的问题
在原有的架构上,同一族的产品中做修改需要全部都修改
特点
一个工厂有多种功能
建造者模式
概念
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
结构
抽象建造者
具体建造者
产品
指挥者
优缺点
优点
客户端不必知道建造的细节,直接调用创建方法即可获取想要的产品对象
每一个建造者都相互独立,不会互相影响,可以很好的拓展
可以精细的控制创建过程
缺点
由于能使用创建者模式的产品需要有很多的共同点,所以很多时候都不适用创建者模式。适用范围很少
如果产品的复杂度比较高,需要很多的创建者类来实现这种变化,增加了系统的复杂度
特点
建造复杂的类,切有很多相似的应用场景
原型模式
概念
使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象
角色
抽象原型类
具体原型类
客户类
单例模式
概念
确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例
饿汉式
懒汉式
线程安全问题
行为型模式
职责链模式
概念
避免将一个请求的发送者与接受者耦合在一起,让多个对象都有机会处理请求。将接受请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止
角色
抽象处理者
具体处理者
理解
链状结构,所有的节点都有共同的父类,审核时每个节点都有自己的处理范围,如果不符合,就调用下一层级的节点处理
命令模式
将一个请求封装成一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作
角色
抽象命令类
具体命令类
调用者
接收者
解释器模式
概念
给定一个语言,定义它的文法的一种表达,并定义一个解释器,这个解释器使用该表达来解释语言中的句子
角色
抽象表达式
终结符表达式
非终结符表达式
环境类
理解
解释器,就是将一种语言解释成另一种语言
可以按照新语言的语法,将不同的主语谓语作为终结符,将一些关联语法或者表达式的作为非终结符
然后制定handle类来拼接终结符非终结符的语法,合并成新的语言类型
迭代器模式
概念
提供一种方法顺序访问一个聚合对象中的各个元素,而又不用暴露该对象的内部表示
角色
抽象迭代器
具体迭代器
抽象聚合类
具体聚合类
子主题
中介者模式
概念
定义一个对象来封装一系列对象的交互。终结者模式使对象之间不需要显式的相互引用。
从而使其耦合松散,而且用户可以独立的改变他们之间的交互
从而使其耦合松散,而且用户可以独立的改变他们之间的交互
角色
抽象中介者
具体中介者
抽象同事类
具体同事类
理解
解耦对象之间的关联关系,将关联关系转移到和中介者
组件都注册到中介者这里,组件之间相互关联的部分都在中介者中维护
备忘录模式
概念
在不破坏封装的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后对这个对象恢复到之前保存的状态
角色
原发器
备忘录
责任人
观察者模式
概念
定义对象之间的一种一对多的关系,使得每当一个对象状态发生改变时其相关依赖对象皆得到通知并被自动更新
角色
目标
具体目标
观察者
具体观察者
理解
处理一对多的一种解决方案
声明一个抽象目标,里面有具体的动作抽象方法和需要发布出去的方法
具体目标实现主要逻辑,需要发布出去的事件调用观察者的方法
观察者维护目标对象的集合,并且遍历这些对象的notify方法
状态模式
概念
允许一个对象在其内部状态改变时改变他的行为,对象看起来修改了它的类
角色
环境类
抽象状态类
具体状态类
策略模式
概念
定义一系列算法,将每一个算法封装起来,并让他们可以相互替换。策略模式让算法可以独立于使用它的客户而变化
角色
环境类
抽象策略类
具体策略类
模板方法模式
概念
定义一个才做系统中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
角色
抽象类
具体子类
模板方法
模板方法
基本方法
抽象方法
具体方法
钩子方法
访问者模式
概念
表示一个作用于某对象结构中的各个元素的操作。访问者模式让用户可以再不改变各元素的前提下定义作用于这些元素的新操作
角色
抽象访问者
具体访问者
抽象元素
具体元素
对象结构
比较
适配器模式
一般是指调用第三方,比如文件转换器,可以有excel,xml的转换器。
结构上是继承目标类,然后将第三方的类引入,调用时,不调用目标类而是适配器
结构上是继承目标类,然后将第三方的类引入,调用时,不调用目标类而是适配器
代理模式
代理类型很多,一般都是在调用原有的方法的基础上增加一个代理类来进行一些额外的操作
结构上是和要代理的类有相同的父类,然后和要代理的类进行组合,重写父类方法,在方法中调用目标类的方法,不改变原有方法
装饰模式
和代理类中的引用代理功能上一致,即在原有方法的基础上进行额外操作。
不同是装饰模式可以重复装饰,比如在蛋糕上添加一个花,再添加一个花
不同是装饰模式可以重复装饰,比如在蛋糕上添加一个花,再添加一个花
结构上装饰类和被装饰类有共同的父类,类的构造方法中参数是父类装饰类型,重写父类方法时调用目标类的方法,改变了原有方法
中介者模式
为了解决各个组件间的相互引用关系而引入的中介者类,将依赖关系解耦,和上面三种模式差别略大
结构上组件类和中介者组合关系,组件需要关联其他组件时,就要调用中介者的方法来实现。
并且组件要注册到中介者中,将自己的实例set到中介者中,典型案例:房产中介
并且组件要注册到中介者中,将自己的实例set到中介者中,典型案例:房产中介
相似的地方
都是调用另一个类中的方法
0 条评论
下一页