最近在研究dubbo的源码,发现在dubbo中装饰者使用的比较多,目前看到在协议扩展方面的使用,而一直有一个疑问萦绕我,就是装饰者为什么比继承更灵活?我们一起来探讨下。

Wrapper类内容:

package com.alibaba.xxx;import com.alibaba.dubbo.rpc.Protocol;public class XxxProtocolWrapper implemenets Protocol {Protocol impl;public XxxProtocol(Protocol protocol) { impl = protocol; }// 接口方法做一个操作后,再调用extension的方法public void refer() {//... 一些操作impl.refer();// ... 一些操作}// ...
}

这里我们就开门见山了,先来看看继承模式:

继承

接口1:

/*** Created by xvshu on 2017/10/11.*/
public interface xxx {void say();
}

实现1:

package test;/*** Created by xvshu on 2017/10/11.*/
public class Fxxx1 implements xxx {public void say(){System.out.println("Fxxx1");}
}

实现2:

package test;/*** Created by xvshu on 2017/10/11.*/
public class Fxxx2 extend Fxxx1 {public void say(){System.out.println("Fxxx2");}
}

我们发现,继承就是无条件接受父类所有实现,类似于单线继承。

装饰者

接口1:

/*** Created by xvshu on 2017/10/11.*/
public interface xxx {void say();
}

实现1:

package test;/*** Created by xvshu on 2017/10/11.*/
public class Fxxx1 implements xxx {protected xxx xxxIn;public void say(){System.out.println("Fxxx1");}
}

划重点:
大家注意,类里引用了一个自己实现的接口,换个角度相当于自己引用自己,这样我们就可以自己赋值给自己,这样就可以给自己穿衣服了,因为自己是可以赋值给另一个自己,增加功能,又赋值给另一个自己,增加另外的功能。

衣服1:

package test;/*** Created by xvshu on 2017/10/11.*/
public class Fxxx11 extends Fxxx1 {protected  xxx xxxIn;Fxxx11(xxx xxxOut){this.xxxIn=xxxOut;}public void sayHello() {System.out.println("hello");}
}

衣服2:

package test;/*** Created by xvshu on 2017/10/11.*/
public class Fxxx12 extends Fxxx1 {protected  xxx xxxIn;Fxxx12(xxx xxxOut){this.xxxIn=xxxOut;}public void eat() {System.out.println("eat");}
}

衣服3:

package test;/*** Created by xvshu on 2017/10/11.*/
public class Fxxx13 extends Fxxx1 {protected  xxx xxxIn;Fxxx13(xxx xxxOut){this.xxxIn=xxxOut;}public void eat() {System.out.println("eat");}
}

原则上我们可以这么用

package test;/*** Created by xvshu on 2017/10/11.*/
public class main {public static void main(String[] args) {//第一种穿衣服:Fxxx13 fxxx_1=new Fxxx13(new Fxxx12(new Fxxx1() ));//第二种穿衣服:Fxxx13 fxxx_2=new Fxxx13(new Fxxx11(new Fxxx1() ));//第三种穿衣服:Fxxx12 fxxx_3=new Fxxx12(new Fxxx13(new Fxxx11( new Fxxx1()) ));}}

总结

现在我们来看看为甚叫装饰,看看下图:

new Fxxx1() 这个主体一直没有变化,如果我们改成这样:

package test;/*** Created by xvshu on 2017/10/11.*/
public class main {public static void main(String[] args) {Fxxx1 me= new Fxxx1();//第一种穿衣服:Fxxx13 fxxx_1=new Fxxx13(new Fxxx12(me ));//第二种穿衣服:Fxxx13 fxxx_2=new Fxxx13(new Fxxx11(me ));//第三种穿衣服:Fxxx12 fxxx_3=new Fxxx12(new Fxxx13(new Fxxx11( me) ));}}

me没有变化,只是在me外包了Fxxx13 ,Fxxx12 或者Fxxx11,或者组合,这样我们需要哪些特性就组合哪些特性,这样的角度,比继承更灵活了一些,而个人感觉,这里最伟大的思想就是自己引用自己,这个在现实世界,我还没有找到例子,真是个伟大的想法,你觉得呢?

《再探设计模式》装饰者:为什么比继承更灵活?相关推荐

  1. java设计模式--装饰器模式

    转载 http://sishuok.com/forum/blogPost/list/5766.html 22.1 场景问题 22.1.1 复杂的奖金计算 考虑这样一个实际应用:就是如何实现灵活的奖金计 ...

  2. Java常用设计模式————装饰者模式

    引言 装饰者模式,又叫装饰器模式.它可以动态的将新功能附加到对象上.在对象功能扩展方面,它比继承更灵活,同时装饰者模式也体现了OCP原则. 在客户端调用使用了装饰者模式的对象时,就好像在使用构造器层层 ...

  3. 设计模式-装饰器模式

    装饰器模式 引言 在玩LOL的时候,我们会对喜欢的英雄购买相应的皮肤,每种皮肤都有不同的效果. 正文 装饰器模式是指在不改变现有对象结构的情况下,可以动态的对当前对象增加新的职责,它属于对象结构型模式 ...

  4. 设计模式——装饰者模式

    本文是阅读 Head First 设计模式--装饰者模式的总结. 这本书的教学模式很不错,个人很喜欢,由实际的案例由浅入深,循序渐进的让你明白良好的设计是多么的优雅迷人(回头看看自己的代码,WTF!) ...

  5. Java设计模式——装饰者模式

    概述 本章可以称为"给爱用继承的人一个全新的设计眼界".我们即将再度探讨典型滥用问题.你将在本章学到如何使用对象组合的方式,做到在运行时装饰类.为什么呢?一旦你熟悉了装饰者的技巧, ...

  6. 设计模式装饰者模式_装饰者模式如何拯救了我的一天

    设计模式装饰者模式 在工作中,我正在处理庞大的Java代码库,该代码库是由许多不同的开发人员在15年的时间里开发的. 并不是所有的事情都由书来完成,但是同时我通常无法重构遇到的每一个奇怪的事物. 尽管 ...

  7. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  8. 读书笔记---Head First 设计模式--- 装饰者模式

    读书笔记-Head First 设计模式- 装饰者模式 装饰者模式(Decorator Pattern) 装饰者模式--动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. ...

  9. C++设计模式 装饰器模式

    文章目录 1. 先验知识 2. 装饰器模式相关概念 3. 装饰器模式的应用 3.1 应用1: 给形状添加新的特征 不同形状加红 3.2 应用2: 给一个人穿不同的衣服 a 直接person类, 增加穿 ...

最新文章

  1. Linux忘记密码常用的几种解决方法
  2. ★☆★ lc 847. Shortest Path Visiting All Nodes
  3. java的继承_java中的继承(一)
  4. 如何估算代码量_千万级用户的大型网站,应该如何设计其高并发架构?(彩蛋)...
  5. CentOS7.3编译安装php7.1
  6. vs2008安装_Visual Studio2008安装教程
  7. sql取日期的年月_机油检测美版银美孚5W30,生产日期20年1月
  8. 计算机专业答辩开场白,毕业答辩开场白三分钟
  9. Android开发笔记(一百五十八)运行时动态授权管理
  10. 电子表格控件Aspose.Cells V17.4.0发布 | 新增重要功能
  11. python 在线培训费用-在线Python编程培训哪家机构比较好?
  12. 在asp.net 中实现只允许数字输入的文本框
  13. Windows中文编码显示问题集锦
  14. Sql2008中添加程序集(转)
  15. Day 1:矩阵归零消除序列和
  16. Linux Mii management/mdio子系统分析之四 mdio总线及phy驱动模型及其开发流程
  17. Android人脸识别活体检测开发入门--基于虹软免费SDK实现
  18. git语法大全(值得收藏)
  19. LeetCode精选TOP面试题(中等篇)【出现率降序】
  20. [Irving]SqlServer 拆分函数用法

热门文章

  1. vr测试速度软件,《VRMARK》首款电脑VR性能测试软件上架steam-VR之家
  2. 0321 复利计算—贷款
  3. stata软件不出图_绘制回归分析结果的森林图,R和Stata软件学起来!
  4. BWAPP靶场-HTML injection-Reflected(GET)
  5. ArrayList源码翻译
  6. 黑底白字html代码,如何用chrome扩展将网页变成黑底白字,用以保护视力
  7. 力扣1217. 玩筹码
  8. 拥抱AI,“纳德拉式”的微软复兴之路 | 人工智能观察
  9. 如果金融男和IT男同时追你,你选谁?
  10. Christmas Gift圣诞创意衬线字体 for mac