知识大全 讲述在Java中Decorate的三种实现方法
Posted 知
篇首语:一天不练手脚慢,两天不练丢一半,三天不练门外汉,四天不练瞪眼看。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 讲述在Java中Decorate的三种实现方法相关的知识,希望对你有一定的参考价值。
讲述在Java中Decorate的三种实现方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Decorator是用于装饰一个事物(或人)的另一个事物(或人) 一个Decorator直接改变被装饰对象的职责或特征 但是不能改变被装饰对象的自有属性 从我们的专业角度来讨论一些存在的实例 JScrollPane可以装饰JComponent的视图部分 JComponent本身并不会被改变 但是增加了一个新的属性(可滚动) BufferedInputStream是InputStream的装饰子 本身BufferedInputStream就是一个InputStream 但是它更快 因为提供了对数据的缓存 考虑一下DebugButton 它与JButton一样 但是它在被点击时可以向日志文件添加消息 DebugButton是JButton的装饰子 因为它直接改变了JButton但并没有改变它的自有属性 再又如ScrollOverButton 它增加了一个鼠标滑过的行为 当鼠标移出时它是平的 当鼠标经过时它具有一个凸起的边框 很显然 ScrollOverButton也是JButton的装饰子 现在 我们知道Decorator可能有三种不同的实现 继承(Inheritance) 封装(Wrapper) 外挂(External) 本文将讨论每一个实现模型 以及它们的优缺点 继承 对于开发人员而言 最直观的Decorator实现就是 写一个派生类 它继承自被装饰类 并赋于新的职责 新的职责可以是通过增加方法或是修改已有方法来实现 public class DebugButton extends JButton public DebugButton() addActionListener(new ActionListener() System out println( debug message ); ); 此外 我们也可以用相同的方式来实现ScrollOverButton 不是增加ActionListener 而是增加MouseListener 在MouseListener回调方法中改变JButton的边框 当mouseEntered()被调用时 将边框从EmpetyBorder变为RaisedBevelBorder 而当mouseExited()方法被调用时 再将边框从RaisedBevelBorder恢复成EmpetyBorder 对于BufferedInputStream 同样实现也是非常简单的 修改每个读数据的方法 让它从内存缓冲区来读取数据 如果缓冲区是空的 它可以通过super read()方法来获取数据并填充缓冲区 JScrollPane 要实现起来就有点复杂 下面我将讨论为什么它会比较难以用继承的方式来实现 讨论一下继承方式实现Decorator模式的优点与缺点 优点 我们几乎可以用这个方式实现所有的Decorator 使用继承方式实现Decorator模式 可以保留被装饰类的原始类型 这一点是非常重要的 用继承方式 我们仍可以使用被装饰类的在被装饰之前的类型 例如 我们可以在我们的应用程序中使用crollOverButton代替JButton 但是JScrollPane就不能代替包含在它内部的对象 缺点 用继承的方式仍不够直接 设想一下我们实现了ScrollOverButton和DebugButton 但是我们又需要实现一个既有ScrollOverButton特点又有DebugButton行为的按钮 怎么办?用继承方式我们唯一的选择就是再派生出一个ScrollOverDebugButton类 如果我们有了ScrollOverDebugButton的实现 那么是否还需要继续保留ScrollOverButton或DebugButton实现?因为我们可以为ScrollOverDebugButton增加两对方法来打开或关闭debug或scroll over的行为 public void setDebug(boolean b); public boolean isDebug(); public void setScrollOver(boolean b); public boolean isScrollOver(); 再进一步考虑 如果将来我们有更多的装饰功能 增加新的U U Un个行为 我们是不是要写一个类 叫U U UnButton?它是不是要包括 n个这样的方法 public void setU(boolean b); public boolean getU;(); 每增加一个新的行为(Un+ )给装饰器就需要增加两个新的方法 并要修改这个装饰器的代码实现 这明显与面向对象的思想相悖 可能会产生严重的后果 (注意 javax swing JButton就是这样实现的) 多数可视化对象的行为是由风格参数来指定的 而风格的改变是不可预知的 当风格发生了改变 我们不得不调整自己的改变 正如上面所述 使用继承的方式可能需要改变实现的代码 要保证被装饰类的原始类型也不是一件容易的事 我们需要重载每个构造子 有时甚至是静态方式 尽管这不困难 但总是相当麻烦的一件事 用继承方式来实现Decorator模式并不象我们先前想像的那么简单 许多时候 我们并不知道将来我们需要哪一些装饰器 结果是 使用继承方式的Decorator在扩展性方面相当困难 并且与面向对象的原则会产生冲突 cha138/Article/program/Java/Javascript/201311/25290相关参考
Java向线程传递数据的三种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在传统的同步开发
Java定时执行任务的三种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
实现Java平台的三种方式v 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 作者蔡学镛 广
用JAVA得到硬盘空间的三种不同方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一般来讲要用
很多朋友应该对荨麻疹这种皮肤病不是很了解,甚至有些人还没有听说过此症。那么家长们可要注意了,儿童是荨麻疹的主要患者人群,如果不及时治疗会导致病情的加重。下面看一下专家是怎么讲述儿童荨麻疹的治疗方法的。
很多朋友应该对荨麻疹这种皮肤病不是很了解,甚至有些人还没有听说过此症。那么家长们可要注意了,儿童是荨麻疹的主要患者人群,如果不及时治疗会导致病情的加重。下面看一下专家是怎么讲述儿童荨麻疹的治疗方法的。
Java多线程初学者指南(7):向线程传递数据的三种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
下面MACD指标中发出的三种卖出信号:(一)DIF线和MACD线的交叉情况分析1、0值线以上区域的强势“死亡交叉”当MACD指标中的DIF线和MACD线在远离0值线以区域同时向上运行很长一段时间并向上
尤其是男孩儿,小时经常出去玩,难免在玩的当中会有磕磕碰碰,小则留下印记,严重则会留一道道疤痕。或是因为先天或后天原因,导致了孩子面部有一些疤痕。很多父母很是苦恼,孩子还小,相信很多人都想在孩子小的时候
尤其是男孩儿,小时经常出去玩,难免在玩的当中会有磕磕碰碰,小则留下印记,严重则会留一道道疤痕。或是因为先天或后天原因,导致了孩子面部有一些疤痕。很多父母很是苦恼,孩子还小,相信很多人都想在孩子小的时候