2021-07-26 装饰器模式与代理模式

装饰器模式

定义

装饰器模式(Decorator Pattern)也叫包装模式(Wrapper Pattern),是指在不改变原对象的基础上通过构造方法将原对象注入Wrapper中,将功能附加到对象上,属于结构型模式

装饰器核心:透明的动态扩展类的功能。

装饰器现实对照:煎饼 +鸡蛋+香肠 == 煎饼

适用场景

  • 拓展类的功能或给类添加附加职责。
  • 动态给对象添加功能,这些功能可以再动态的撤销。

通用写法

  1. 装饰者与被装饰者实现相同的接口,然后通过构造方法将被接口注入过来,装饰者通过实现接口相同的方法实现了在原对象的基础对功能的拓展;
  2. 由于装饰器和被装饰者属于同一类型(均为接口的实现),且构造函数参数为接口类,因此装饰器模式具备嵌套拓展功能。
//TODO 代码练习
构造体系,被装饰的对象通过构造方法注入装饰器中。

实现案例:InputStream、BufferedReader

装饰者模式.png

装饰器模式和代理模式的对比

  1. 装饰器模式是一种特殊的静态代理模式
  2. 装饰器模式强调自身功能的拓展,你要求煎饼+鸡蛋 ——装饰器(客户主动拓展,一层套一层,将功能选择权交给客户);
  3. 代理模式强调代理过程的控制,商家做好了一个加鸡蛋的煎饼,供你选择—代理(功能已拓展,客户无法主动);

装饰器模式优缺点

优点

  1. 装饰器是继承的有力补充,比继承灵活,即插即用
  2. 通过使用不同装饰类以及这些装饰类不同的排列组合,可以实现不同的效果
  3. 遵守开闭原则;

缺点

  1. 出现更多的装饰类,增加程序复杂性;
  2. 动态装饰时需要实现多次嵌套,更复杂;

场景:权限可以使用装饰器模式来设计

问题: 1.使用装饰器模式实现一个可根据权限动态扩展功能的导航条。

代理模式 -- 中介

定义

代理模式(Proxy Pattern) 是指为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到了中介作用,属于结构模式

适用场景

  1. 保护目标对象
  2. 增强目标对象

通用写法

代理模式一般包含三个角色

  • 抽象对象(Subject):主要职责是存储了目标对象与代理的共同方法,该类可以是接口/抽象类;
  • 目标对象(RealSubject):该类为被代理类,负责执行真正的业务逻辑
  • 代理对象(Proxy):该类为代理类,内部持有被代理对象的引用,客户端通过调用代理对象的方法,来间接访问目标对象的方法,通常代理对象会对被代理对象的方法进行增强
代理模式.png

分类

静态代理

特点:显示声明被代理对象

案例:日常开发中的三层结构

动态代理

特点:基本原理根据底层逻辑动态生成代理类,底层都是通过反射来实现的

动态代理和静态代理的区别:

动态代理不管被代理目标是什么都可以代理,静态代理的对象必须固定。

动态代理—JDK

JDK动态代理采用字节重组,代理对象通过实现InvovationHandler接口重新生成对象替代原对象,来到达动态代理的目的。

JDK动态代理生成对象的步骤

  1. 动态生成源码.java 文件

  2. Java文件输出到磁盘,保存为文件$Proxy0.java。

    JDK动态代理命名规则:$+Proxy+JDK维护的自增ID

    JDK动态代理命名规则.png
  3. 把.java文件编译成$Proxy0.class文件

  4. 把生成的.class文件加载到JVM中

  5. 返回新的代理对象

//TODO 动态代理原理简单实现
动态代理—CGlib

通过实现MethodInterceptor接口动态继承目标对象来实现动态代理的功能

CGlib动态代理采用了FastClass机制,在第一次执行MethodProxy.invoke()方法的时候回生成FastClass类并存放在缓存中。

FastClass机制:为代理类和被代理类各生成一个类,这个类会为代理类或被代理类的方法分配一个Index(int类型),这个index当做一个入参,FastClass就可以直接定位要调用的方法进行调用省去了反射调用的时间,所以调用效率比JDK通过反射调用高。

CGLib动态代理.png

代理模式优缺点

优点

  • 将被代理对象与调用对象进行分离降低了系统的耦合性
  • 代理可起到保护目标对象的作用,增加目标对象的功能

缺点

  • 出现更多的代理类,增加程序复杂性;
  • 客户端和目标对象之间增加了代理对象,使得请求处理速度变慢

注意:目的类和代理类需要共同的继承体系(继承相同的父类或者实现相同的接口)

场景

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

推荐阅读更多精彩内容