设计模式与范式 --- 适配器模式、装饰器模式与代理模式的区别与联系

简介: 设计模式与范式 --- 适配器模式、装饰器模式与代理模式的区别与联系

1.设计意图



(1)适配器模式


结构图


image.png

设计意图


将一个类的接口转换成另外一个客户希望的接口,分为基于多继承的类适配和基于对象组合的对象适配。


Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。Adapter模式通过类的继承或者对象的组合侧重于转换已有的接口,类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。


例如:笔记本 电源适配器,可以将220v转化为适合笔记本使用的电压。


适用场景


  • 你想使用一个已经存在的类,而它的接口不符合你的需求。
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  • 你想使用一些已经存在的子类(仅适用于对象Adapter),但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。


(2)装饰器模式


结构图


image.png

设计意图


根据实际需要,实现运行中动态地给一个对象添加一些额外的职责。


就增加功能来说,Decorator模式相比生成子类更为灵活。Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。同时它很好地符合面向对象设计原则中“优先使用对象组合而非继承”和“开放-封闭”原则。


例如:一幅画,可以直接挂到墙上,也可以加上框架和镶上玻璃后,再挂到墙上。


适用场景


  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 处理那些可以撤消的职责。
  • 当不能采用生成子类的方法进行扩充时。
  • 一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。
  • 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。


(3)代理模式


结构图


image.png

设计意图


为其他对象提供一种代理以控制对这个对象的访问,解决直接访问某些对象是出现的问题。


例如:律师本身就是我们维权的一个代理!


适用场景


在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。


下面是一 些可以使用Proxy模式常见情况:


  • 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。
  • 虚代理(Virtual Proxy)根据需要创建开销很大的对象。
  • 保护代理(ProtecTIon Proxy)控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。


智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。 它的典型用途包括:


  • 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为SmartPointers)。
  • 当第一次引用一个持久对象时,将它装入内存。
  • 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。


2.联系与区别



image.png

(1)联系:


适配器模式、装饰器模式与代理模式都属于设计模式中的结构型模式,都是通过从程序结构上解决模块之间的耦合问题(结构上进行解耦)。都是基于基本的设计原则,即对扩展开放,对修改关闭


(2)区别:


  • 适配器的特点在于兼容,从代码上的特点来说,适配类与原有的类具有相同的接口,并且持有新的目标对象。就如同一个3孔转2孔的适配器一样,在使用适配器模式的时候,我们必须同时持有原对象,适配对象,目标对象。
  • 装饰器模式特点在于增强,即被装饰类和所有的装饰类必须实现同一个接口,而且必须持有被装饰的对象,可以无限装饰。
  • 代理模式的特点在于隔离,隔离调用类和被调用类的关系,通过一个代理类去调用。


总的来说就是如下三句话:


  • 适配器模式是将一个类(a)通过某种方式转换成另一个类(b)。
  • 装饰模式是在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b)。
  • 代理模式是将一个类(a)转换成具体的操作类(b)。


3.总结



  • 适配器模式:只需要将原接口转化为客户希望的另一个接口。
  • 实现方式:1.继承原类或者实现原接口(类适配) 2.持有原接口的对象,再实现目标接口(对象适配)。
  • 代理模式:为其他对象提供一个代理控制对这个对象的访问。
  • 和适配器模式最大的区别:代理模式是与原对象实现同一个接口,而适配器类则是匹配新接口,即实现一个新的接口。
  • 装饰器模式:必须要有被装饰的类和装饰的类!
  • 从对象使用角度来看,代理模式一定是自身持有这个对象,不需要从外部传入。而装饰模式的一定是从外部传入,并且可以没有顺序,按照代码的实际需求随意挑换顺序;
  • 从使用上来看,代理模式注重的是隔离限制,让外部不能访问你实际的调用对象,比如权限控制。装饰器模式注重的是功能的拓展,在同一个方法下实现更多的功能。


参考



http://www.elecfans.com/article/83/116/2017/20171018566111.html


相关文章
|
3月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
45 0
|
1月前
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
|
1月前
|
设计模式 前端开发 数据安全/隐私保护
前端必须掌握的设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过引入“替身”对象来间接访问真实对象,从而解耦并提升性能和安全性。例如,知名艺人复出后,经纪人作为代理筛选商单,确保只处理符合团队利益的请求。代码实现中,定义接口`IService`,艺人和经纪人都实现该接口,经纪人在访问时进行过滤和转发。代理模式常用于权限控制、性能优化等场景,如前端中的Tree-shaking和ES6的Proxy构造方法。
前端必须掌握的设计模式——代理模式
|
1月前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
4月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
4月前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
4月前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
|
3月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
68 0
|
4月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
22天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。