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

1.设计意图

(1)适配器模式

结构图

设计意图

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

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

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

适用场景

  • 你想使用一个已经存在的类,而它的接口不符合你的需求。

  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

  • 你想使用一些已经存在的子类(仅适用于对象Adapter),但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

(2)装饰器模式

结构图

设计意图

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

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

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

适用场景

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

  • 处理那些可以撤消的职责。

  • 当不能采用生成子类的方法进行扩充时。

    • 一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。

    • 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

(3)代理模式

结构图

设计意图

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

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

适用场景

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

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

  • 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。

  • 虚代理(Virtual Proxy)根据需要创建开销很大的对象。

  • 保护代理(ProtecTIon Proxy)控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。

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

  • 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为SmartPointers)。

  • 当第一次引用一个持久对象时,将它装入内存。

  • 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

2.联系与区别

(1)联系:

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

(2)区别:

  • 适配器的特点在于兼容,从代码上的特点来说,适配类与原有的类具有相同的接口,并且持有新的目标对象。就如同一个3孔转2孔的适配器一样,在使用适配器模式的时候,我们必须同时持有原对象,适配对象,目标对象。

  • 装饰器模式特点在于增强,即被装饰类和所有的装饰类必须实现同一个接口,而且必须持有被装饰的对象,可以无限装饰。

  • 代理模式的特点在于隔离,隔离调用类和被调用类的关系,通过一个代理类去调用。

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

  • 适配器模式是将一个类(a)通过某种方式转换成另一个类(b)。

  • 装饰模式是在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b)。

  • 代理模式是将一个类(a)转换成具体的操作类(b)。

3.总结

  • 适配器模式:只需要将原接口转化为客户希望的另一个接口。

    • 实现方式:1.继承原类或者实现原接口(类适配) 2.持有原接口的对象,再实现目标接口(对象适配)。
  • 代理模式:为其他对象提供一个代理控制对这个对象的访问。

    • 和适配器模式最大的区别:代理模式是与原对象实现同一个接口,而适配器类则是匹配新接口,即实现一个新的接口。
  • 装饰器模式:必须要有被装饰的类和装饰的类!

    • 从对象使用角度来看,代理模式一定是自身持有这个对象,不需要从外部传入。而装饰模式的一定是从外部传入,并且可以没有顺序,按照代码的实际需求随意挑换顺序;

    • 从使用上来看,代理模式注重的是隔离限制,让外部不能访问你实际的调用对象,比如权限控制。装饰器模式注重的是功能的拓展,在同一个方法下实现更多的功能。

参考

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容