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

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

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


相关文章
|
7月前
|
设计模式 Java 数据库连接
【设计模式】【结构型模式】代理模式(Proxy)
一、入门 什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式,允许你提供一个代理对象来控制对另一个对象的访问。 代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对
180 10
|
7月前
|
设计模式 前端开发 Java
【设计模式】【结构型模式】适配器模式(Adpter)
一、入门 什么是适配器模式? 适配器模式是Java中常用的结构型设计模式,它的核心作用就像现实中的电源转换器一样---让原本不兼容的两个接口能够协同工作。 为什么要用适配器模式? 假设我们需要在电商系
175 10
|
11月前
|
设计模式 Java 开发者
「全网最细 + 实战源码案例」设计模式——适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,通过引入适配器类将一个类的接口转换为客户端期望的另一个接口,使原本因接口不兼容而无法协作的类能够协同工作。适配器模式分为类适配器和对象适配器两种,前者通过多重继承实现,后者通过组合方式实现,更常用。该模式适用于遗留系统改造、接口转换和第三方库集成等场景,能提高代码复用性和灵活性,但也可能增加代码复杂性和性能开销。
378 28
|
11月前
|
设计模式 缓存 Java
「全网最细 + 实战源码案例」设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过代理对象控制对目标对象的访问并添加额外功能。它分为静态代理和动态代理,后者包括JDK动态代理和CGLIB动态代理。JDK动态代理基于接口反射生成代理类,而CGLIB通过继承目标类生成子类。代理模式适用于延迟初始化、访问控制、远程服务、日志记录和缓存等场景,优点是职责分离、符合开闭原则和提高安全性,缺点是增加系统复杂性。
262 25
|
10月前
|
设计模式 中间件 Java
设计模式3:代理、适配器、装饰器模式
代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。
172 3
|
12月前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
12月前
|
设计模式 前端开发 数据安全/隐私保护
前端必须掌握的设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过引入“替身”对象来间接访问真实对象,从而解耦并提升性能和安全性。例如,知名艺人复出后,经纪人作为代理筛选商单,确保只处理符合团队利益的请求。代码实现中,定义接口`IService`,艺人和经纪人都实现该接口,经纪人在访问时进行过滤和转发。代理模式常用于权限控制、性能优化等场景,如前端中的Tree-shaking和ES6的Proxy构造方法。
前端必须掌握的设计模式——代理模式
|
7月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
203 16
|
7月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
210 0
|
7月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
195 0

热门文章

最新文章