JVM:”上次给我招的工人不错啊!”

oo程序员:”………..”

JVM:”现在来我开的博物馆生意越来越好了,原来”舞台剧”的方式已经不能满足顾客的需求了”

oo程序员:”………..”

JVM:”我决定要换一种运营模式,把每个演播厅都租出去,让那些想表演节目的对象们来租演播厅和相关器械,这样我就能坐地收钱了!”

oo程序员:”………..”

JVM:”合伙干吧?怎么样?你三我七!”

oo程序员:”………..”

JVM:”四六?”

oo程序员:”成交!先说说需求。”

JVM:”首先有不同类型的演播厅和不同的装饰品/器械,每种物品都要付一定的租金,你要做的就是一件事,把总租金(演播厅+饰品/器械)算出来。”

oo程序员:”把价格表给我!”

仔细一想也对,无论是演播厅还是装饰品,都需要描述(description)和cost(价格),写一个共同的父类无可厚非。

接着写下你设计的第一个类:

第三个:

。。。。。

没有第三个了!这样写下去可是无穷无尽的!没办法,换个思路。

在演播厅里,无论什么装饰品都有可能出现,可以把演播厅+饰品看成一个整体,通过饰品相应的has和set来控制饰品,这样的话,设计出来的类如下:

这个看起来好多了,不用写大爆炸数量的类,虽然类写起来又臭(无数的has/set)又长(的确很长)。。。。。

但是有没有更好的方案?

答案当然是有的,不过我们必须先明确一下,上述设计的缺点。

1.臭

2.长

3.当饰品的租金改变的时候,必须修改所有演播厅的代码(cost部分),我们当然不想这样,我们想尽可能的少修改代码(松耦合)。

4.没有面对超类/接口编程。

5.没有将变化的部分独立开。

6.组合可能是更好的解决方案。

下面让我们看看。装饰者模式是如何解决上面问题的。

装饰者模式:动态的将责任加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

首先,我们先将演播厅和他的装饰者们分开,让装饰者继承另一个类:

让装饰者子类重新实现getDescription()即可。

现在我们的思路是:用装饰者装饰演播厅,例如,一个带麦克风和气球的卡通演播厅,就先让气球装饰卡通演播厅,再让麦克风装饰“带气球的卡通演播厅”

先让我们分别实现这3个类:

卡通演播厅:

气球:

结果是正确的。

这样写很好的解决了上面的问题。

1.运用组合进行扩展,使当价格改变的时候,只需要修改本身的代码。

2.面对超类/接口编程,使饰品增加种类的时候,并不需要修改被装饰者的代码。

3.开放——关闭原则 :代码应该对扩展开放,对修改关闭。

缺陷:

1.子类繁多,影响理解代码(java I/O就是装饰者模式哦。。。)。

2.无法应用于需要具体类的场景。

java装饰模式理解_Java设计模式之装饰模式趣谈相关推荐

  1. 设计模式java装饰模式范例_Java设计模式之装饰模式详解

    装饰者模式是动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 假设我们有一个需求,是给一家饮料店做一个计算各种饮料价格的功能.听起来很简单,我们创建一个抽象父类Bever ...

  2. Java私塾:研磨设计模式 之 装饰模式(Decorator)3

    22.3  模式讲解 22.3.1  认识装饰模式 (1)模式功能 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观.当装饰过后,从外部使用系统的角度看 ...

  3. java 设置模式_Java设计模式百例 - 调停者模式

    调停者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性的.这种模式提供了一个调停者类,用来充当"中心化"或"总线化"的角色,与各个 ...

  4. java 影子实例_java设计模式(四)--单例模式

    Singleton最熟悉不过了,下面学习单例模式.转载:http://zz563143188.iteye.com/blog/1847029 单例对象(Singleton)是一种常用的设计模式.在Jav ...

  5. java 行为模式_java设计模式--行为模式

    前言 行为模式是描述多个类与对象之间通过协作共同完成单个对象无法单独完成的任务. 行为模式分为: 类行为模式通过集成在类之间分派行为 对象行为模式通过组合或聚合在对象之间分配行为 行为模式: 模板方法 ...

  6. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  7. java 反射模式_java 设计模式——反射机制的应用

    Java反射机制是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言 ...

  8. java 异常 理解_java异常理解(1)

    JAVA异常处理机制 1引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我, ...

  9. java 对象工厂_Java设计模式之--工厂方式

    在分析工厂模式之前,我们先看看普通模式下的Java三层结构. Controller(表现层)-Service(业务层)-Dao(持久层.数据库连接层),基于此三层结构完成JavaWeb相关业务. 假设 ...

最新文章

  1. Left,Right,Outer和Inner Joins有什么区别?
  2. spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题
  3. matlab dicom图像异常,用Matlab处理Dicom图像
  4. 北漂的程序员们,这寒冬你是否“有枝可依”?
  5. 并查集--Java实现
  6. 并行开发 4.同步机制(上)
  7. [2019杭电多校第五场][hdu6630]permutation 2
  8. Caffe学习:使用pycaffe绘制网络结构
  9. python2异步编程_Python3异步编程
  10. Python基础 day2
  11. 模拟电路全系列复习题 恶补知识点
  12. 类加载器详解(自己实现类加载器)
  13. Java批量下载有道单词发音+与Anki卡片整合
  14. 第七篇:A133 Android 10 触摸提示音过大
  15. python获取windows当前登录用户名 域 计算机名 mac地址 ip
  16. 基于C#实现与新大陆扫码枪通信
  17. AI:人工智能领域之AI发展史(人工智能发展历史)之详细攻略
  18. 1688搜索店铺列表 API
  19. 高等教育心理学:学生的个性与社会性的发展
  20. c++语言drawtext字体旋转,使用DrawText函数对文本进行换行处理的实现

热门文章

  1. Leetcode每日一题:88.merge-sorted-array(合并两个有序数组)
  2. 数学建模4 拟合算法
  3. 机器学习-吴恩达-笔记-5-神经网络学习
  4. jsjq面试笔记(下)
  5. x的奇幻之旅 (史蒂夫·斯托加茨 著)
  6. c语言代码re通常什么错误,C语言,realloc动态内存申请,出现报错double free or corruption (!prev)...
  7. java连接数据库 oracle,Oracle数据库之一分钟教你学会用java连接Oracle数据库
  8. 通用Shell脚本,可以优雅的启动/关闭/重启/JAVA服务
  9. Jenkins 在Windows下插件无法安装问题解决
  10. [Ext JS]8.3 Sencha Studio安装与快速介绍之一