一、概述
装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能。

不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的。

而实际上,装饰器模式和代理模式的实现方式基本一致,只在目标的存在上有些差别,这个后面我们具体讲述。

二、初步分析
上面提到了两点:

涉及的是单方
目标是抽象的
我们来想一下,所谓单方主要指的是在整个装饰器模式中不存在双方调用,要解决的也不是双方调用的问题,而是解决单方提供对外服务的问题,这个单方在自行对外提供服务时,功能不足,或者我们需要额外添加一些新功能,这时就可以使用装饰器模式,来对这个单方进行增强。

目标抽象的意思是因为我们需要通过实现接口的方式来进行增强,因此目标必须抽象为接口。

三、实例
下面我们用我们生活中的一个例子来说明,我们用房子来作为目标:

房子接口:House

/**

  • 目标接口:房子
    */
    public interface House {
    void output();
    }
    具体的房子:DonghaoHouse

/**

  • 房子实现类
    */
    public class DonghaoHouse implements House {
    @Override
    public void output() {
    System.out.println(“这是董浩的房子”);
    }
    }
    具体的房子:DongliangHouse

/**

  • 房子实现类
    */
    public class DongliangHouse implements House {
    @Override
    public void output() {
    System.out.println(“这是董量的房子”);
    }
    }
    装饰器:Decorator

public class Decorator implements House {
private House house;
public Decorator(House house){
this.house = house;
}
@Override
public void output() {
System.out.println(“这是针对房子的前段装饰增强”);
house.output();
System.out.println(“这是针对房子的后段装饰增强”);
}
}
测试类:

public class Clienter {
public static void main(String[] args) {
House donghaoHouse = new DonghaoHouse();
House decorator = new Decorator(donghaoHouse);
decorator.output();
}
}
执行结果为:

这是针对房子的前段装饰增强
这是董浩的房子
这是针对房子的后段装饰增强
四、解析
通过上面的例子我们可以看出,除了测试类外,只剩下接口和实现类了,即使是装饰器类也是目标接口的一个字类,这更能说明单方的说法,模式中所有的类都属于目标方。至于目标是抽象的更是如此,只有目标是抽象的,才可以使用装饰器模式来进行增强。

上面我们说过装饰器模式与代理模式基本相同,只存在少许差别。

我们需要从概念上了解代理和装饰的区别:

代理是全权代理,目标根本不对外,全部由代理类来完成。
装饰是增强,是辅助,目标仍然可以自行对外提供服务,装饰器只起增强作用。
上面两点提现到代码实现中是这样的:
代理模式

public class Proxy implements House {
private House house;
public Decorator(){
this.house = new DonghaoHouse();
}
@Override
public void output() {
System.out.println(“这是针对目标的前段增强”);
house.output();
System.out.println(“这是针对目标的后段增强”);
}
}
装饰模式

public class Decorator implements House {
private House house;
public Decorator(House house){
this.house = house;
}
@Override
public void output() {
System.out.println(“这是针对房子的前段装饰增强”);
house.output();
System.out.println(“这是针对房子的后段装饰增强”);
}
}
看出来了吗,装饰器中持有的目标实例是从构造器传入的,而代理中持有的目标实例是自己创建的。

那么这里又出现一个区别,代理模式和装饰器模式虽然都依赖于目标接口,但是代理针对的目标实现类是固定的,而装饰器模式可以随意指定,也就是说目标是可以自有扩展的。

五、使用场景
装饰器模式就是使用在对已有的目标功能存在不足,需要增强时,前提是目标存在抽象接口。

六、总结
我们要明白代理模式和装饰器模式的区别,区分二者的使用场景,如下图:

Java设计模式之《装饰器模式》及应用场景相关推荐

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

    一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...

  2. (设计模式七)java设计模式之装饰器模式

    一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...

  3. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  4. Java 设计模式之装饰器模式

    装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...

  5. java设计模式之装饰器模式(包装器模式)

    显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...

  6. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  7. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  8. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  9. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

  10. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

最新文章

  1. java和python的比较-如何对比Python和Java,只需三分钟告诉你!
  2. 携程基于Storm的实时大数据平台实践
  3. 前端_网页编程 HTTP协议(进阶)
  4. 【JEEWX企业号专题】JEEWX与微信企业号对接,激活应用回调模式
  5. C语言 指针与结构体
  6. 通过脚本生成Zabbix Screen报错Incorrect value for field vsize
  7. 转:vs2012远程调试功能的改进
  8. MKAnnotationView,MKAnnotation与MKMapView结合使用显示坐标点
  9. Java 并发编程(一):简介
  10. 面试题之消息中间件(MQ与RabbitMQ)
  11. 简单的基于规则的汉语拼音分词
  12. Type-c快充加音频芯片深度解析(LDR6023C)
  13. ROS从入门到精通系列(十三)-- PR2移动双臂机器人基础
  14. yum linux gcc安装包下载,linux下安装yum及gcc
  15. Firebase简介
  16. 超级玛丽马里奥版下载_将超级马里奥赋予生命
  17. ttf格式字体怎么安装教程
  18. PMP的报名、考试流程
  19. 刚进入软件测试的行业,就我学习到的关于软件测试的基础知识做以下总结。...
  20. 阿里短信 ajax,阿里大于-短信验证码接口

热门文章

  1. Python之禅 吾心笃定
  2. v2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\imgwarp.cpp:5594: error: (-215) (M0.t
  3. ue4 开发动作游戏_ue4游戏开发虚幻4学习教程资源素材合集
  4. 怎么把图片转换成BMP格式
  5. UEFI之PEI阶段
  6. pandas使用query函数查询dataframe中某一个数据列在指定数据范围的数据行(rows where value is between two values in dataframe)
  7. 六级答案已出,计算机er要考多少分才能保个好学校?
  8. 桌面计算机 回收站图标,桌面回收站图标不见了怎么解决【图文】
  9. web项目经理手册-项目经理需要铭记在心...
  10. uniapp (H5、小程序、app)地图导航