1、介绍

装饰器模式是一种结构型的设计模式。使用该模式的目的是为了较为灵活的对类进行扩展,而且不影响原来类的结构。有同学说可以通过继承的方式进行实现啊,没错,继承的确可以实现,但是继承的成本相对比较高,而且如果涉及到扩展多个功能的话,继承实现起来的成本较大。

装饰器模式的思想是,对原来的类进行一层封装,通过依赖实现扩展。但是装饰器的依赖有两个比较重要的特点。

第一,装饰器的抽象类,依赖的是原来类的接口。装饰器的实现类与原本的类之间,不会存在耦合的现象,两个类可以各自进行对应的变化。这一点与桥接模式是相同的。

第二,装饰器的抽象类会同时继承原来类的接口,从而保证装饰器的实现类具有与原来的类一样的方法,只是装饰器实现类的方法有新的扩展。可以理解为对原有类的某种功能或者特性的加强。这样产生的效果就是,从使用者的角度来看,会更加的便捷,因为原来的类与装饰器类具有一样的方法,真是其中实际的功能和作用进行了加强。

装饰器模式的使用场景,抽象来说就是需要扩展类但是又不想引入子类,或者也可以根据字面的含义,能与装饰或者功能加强有关的场景。比如说,一张画,是可以欣赏的,但是没有办法挂到墙上。那么我们可以找一个相框(装饰器实现类),将画放到相框中,之后就可以把这个带相框的画挂到墙上了。再比如说,我们买了一张床,就可以在上边睡觉了。但是我们希望睡的更加舒服,所以需要在床上增加一个装饰,比如垫上床垫,加上枕头,盖上床单。装饰之后,它依然有承载睡觉的属性。

2、案例

2.1、背景

就举一个上文提到的画与画框的例子。为了提高节操,哦不,是情操,本同学需要观赏(接口)一下工艺品。谈到观赏,我们可以观赏油画和水墨画(接口实现类)。但是油画和水墨画无法挂在墙上让众人欣赏,所以我们希望找一个相框(装饰器抽象类),将画放进去,然后挂起供人欣赏(装饰或者功能加强)。之后,我们终于找到了一个木质的相框(装饰器实现类),装饰之后,具有更好的观赏效果。

2.2、实现

1)定义观赏的接口

public interface Look {public String LookAtPic();
}

2)定义观赏的实现类

public class InkPic implements Look
{@Overridepublic String LookAtPic(){return "欣赏水墨画";}
}
public class OilPic implements Look
{@Overridepublic String LookAtPic() {return "欣赏油画";}
}

3)定义装饰器抽象类

public abstract class PicDecorator implements Look
{private Look look;public Look getLook() {return look;}public void setLook(Look look) {this.look = look;}public PicDecorator(Look look) {this.look = look;}@Overridepublic abstract String LookAtPic();
}

4)装饰器实现类

public class WoodPicDecorator extends PicDecorator
{public WoodPicDecorator(Look look) {super(look);}@Overridepublic String LookAtPic() {return this.getLook().LookAtPic() + ",木质相框";}
}

5)运行

public class Test
{public static void main(String[] args){OilPic oilPic = new OilPic();System.out.println(oilPic.LookAtPic());WoodPicDecorator woodPicDecorator = new WoodPicDecorator(oilPic);System.out.println(woodPicDecorator.LookAtPic());InkPic inkPic = new InkPic();System.out.println(inkPic.LookAtPic());woodPicDecorator = new WoodPicDecorator(inkPic);System.out.println(woodPicDecorator.LookAtPic());}
}

结果

欣赏油画
欣赏油画,木质相框
欣赏水墨画
欣赏水墨画,木质相框

3、总结

装饰器模式的关键代码有两点:第一,装饰器抽象类依赖原接口;第二,装饰器抽象类实现原接口。

优点:低成本扩展类的方法(功能加强)

缺点:这种方法非常精巧,非要找一个缺点的话,那就是精巧的东西一般都不太好理解。

Java设计模式----------装饰器模式相关推荐

  1. Java设计模式-装饰器模式 理论代码相结合

    继Java设计模式适配器模式后的装饰器模式来啦,让我们一起看看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一 ...

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

    Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样.因此,装饰器模式具有如下的特征: 它必须具有一个装饰的对象. 它必须拥有与被装饰对象相同的接口. ...

  3. JAVA设计模式-装饰器模式(Decorator)

    装饰器模式(Decorator) 为了某个实现类在不修改原始类的基础上进行动态地覆盖或者增加方法 采用--------装饰器模式 实现类要保持与原有类的层级关系 装饰器模式是一种特殊的适配器模式 拿适 ...

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

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

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

    装饰者模式 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 具体被装饰者和抽象装饰类都继承于抽象被装饰者类,继承的是类型,而不是行为.行为来自装饰者和基础组件,或与其他 ...

  6. Java —— Decorator 装饰器模式

    文章目录 Java -- Decorator 装饰器模式 简介 用处 简单例子 结构 代码 涉及角色 相关的设计模式 应用实例 优点 缺点 使用场景 注意事项 代码 Java -- Decorator ...

  7. Go 设计模式 - 装饰器模式

    装饰模式使用对象组合的方式动态改变或增加对象行为.Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式.使用匿名组合,在装饰器中不必显式定义转调原对象方法. 设计模式 装饰器模式 装饰器模式主要 ...

  8. Java设计模式 -10- 装饰器模式(Decorator模式)

    Java设计模式 -10- 装饰器模式(Decorator模式) 前言 装饰器模式的定义与特点 优点: 缺点: 装饰器模式的结构与实现 1. 模式的结构 2. 模式的实现 装饰器模式的应用实例 装饰器 ...

  9. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

最新文章

  1. 霹雳小组4显示不了服务器,霹雳小组4-指令码
  2. linux注销、关机、重启
  3. 我平时比较喜欢的几篇技术文章
  4. Java中集合list的add方法添加的不是值COPY而是地址
  5. JavaWeb03-HTML篇笔记(二)
  6. 提示缺少msvcpNNN.dll怎么办
  7. java流程图平行四边形_编程技巧之流程图
  8. 基于mindwave脑电波进行疲劳检测算法的设计(5)
  9. 由pytorch中的super().__init__到python中的测试
  10. nginx error_log 日志配置
  11. 《赢在中国》-创业者学历
  12. 期末大作业纯前端技术实现个人简历模板
  13. php获取当前周的起止日期,使用PHP实现获取周的起始和结束日期
  14. 〖全域运营实战白宝书 - 运营角色认知篇⑧〗- 运营人的发展路径
  15. 计算机过去现在和未来图片,数据驱动的图形学:过去、现在和未来
  16. 「论文翻译」Predicting gene-disease associations via graph embedding and graph convolutional networks
  17. iOS 键盘添加工具栏
  18. 如何选择合适的语音聊天app开发方式实现语音连麦
  19. excel程序里计算机在哪,excel在电脑上哪找?_excle在哪里
  20. 【Realflow】Domain 节点翻译

热门文章

  1. 信号与系统 matlab实验报告,信号与系统Matlab实验报告模板
  2. python为什么慢
  3. 桌面图标变白色解决办法
  4. Fiddler断点调试
  5. Controller与RestFul风格
  6. 一个在DOS下处理中文和长名字目录和文件的程序(原创)
  7. 小学生编程软件python_Python编程工具pycharm的使用
  8. C语言再学习24——__attribute__ (at())地址定位
  9. 信息安全——MD5的实现
  10. layer msg 图标