标签:字节 bst crete 传递 类别 请求 ext print and
如下,ConcreteComponent是我们程序中使用的组件类。它实现了Component接口。现在想增加ConcreteConponent的功能,怎么做呢?
interface Component { void operation(); } class ConcreteConponent implements Component { @Override public void operation() { System . out. println( "我是一个具体组件(ConcreteComponent)对象,我的能力是可以输出当前这句话" ); } }
测试代码
interface Component { void operation (); } class ConcreteConponent implements Component { @Override public void operation() { System . out. println( "我是一个具体组件(ConcreteComponent)对象,我的能力是可以输出当前这句话" ); } } /********************************************************************/ class Decorator implements Component { private Component component; //用于保存被装饰对象的引用。 public Decorator ( Component component ) //将被装饰的对象注入到装饰类中 { this .component = component ; } @Override public void operation() { component .operation (); //保证被装饰对象的功能不丢失和破坏。 } } /* * 具体装饰器类SuperComponent * */ class SuperComponent extends Decorator { public SuperComponent ( Component component ) { super (component ); } @Override public void operation() { super .operation (); //保证被装饰对象的功能不丢失和破坏。 enhance (); } public void enhance() { //增加的功能 System . out. println( "经过装饰后,我已经被是一个超级组件了!我是在装饰类(SuperComponent)中额外添加的新功能" ); } } /* * 具体装饰器类SmartComponent * * */ class SmartComponent extends Decorator { public SmartComponent ( Component component ) { super (component ); } @Override public void operation() { super .operation (); smart (); } public void smart() { //增加的功能 System . out. println( "经过装饰后,我已经被是一个智能组件了!我是在装饰类(SmartComponent)中额外添加的新功能" ); } }
客户端代码
可以发现,客户端完全面向抽象编程,不论是具体组件,还是抽象装饰器,或是具体装饰器,对于客户端来说,都是Component。
由于每一个具体装饰器对象也属于一个Component,因此我们可以将具体装饰器再次注入到其它的装饰器中,进行叠加装饰。
public static void main (String [] args ) { Component normalComponent = new ConcreteConponent (); // 一个具体的 普通组件对象 normalComponent .operation (); System . out. println( "---" ); //将普通组件注入到SuperComponent装饰器中,装饰为 超级组件 Component superComponent = new SuperComponent (normalComponent ); superComponent .operation (); System . out. println( "---" ); //将普通组件注入到SmartComponent装饰器中,装饰为 智能组件 Component smartComponent = new SmartComponent (normalComponent ); smartComponent .operation (); System . out. println( "---" );
//将超级组件注入到SmartComponent装饰器中,装饰为 智能 超级组件 Component smartAndSuperComponent = new SmartComponent (superComponent ); smartAndSuperComponent .operation (); }
我们讨论的是Java IO中的 InputStream 、FileInputStream 、 FilterInputStream 、 BufferedInputStream 之间的关系,他们的设计满足装饰器模式。
FileInputStream
是一个具体的InputStream实例,我们可以使用BufferedInputStream去装饰他。
InputStream
FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。FilterInputStream 类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。FilterInputStream 的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
他持有了一个InputStream对象引用,且通过构造函数将被装饰对象InputStream注入,且对read方法进行简单实现。
public class FilterInputStream extends InputStream { protected volatile InputStream in ; protected FilterInputStream ( InputStream in ) { this .in = in ; } //...... public int read() throws IOException { return in . read(); } }
BufferedInputStream
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。
public class BufferedInputStream extends FilterInputStream { public BufferedInputStream(InputStream in, int size) { // 通过构造函数将被装饰的对象 InputStream 注入 super(in); if (size <= 0) { throw new IllegalArgumentException("Buffer size <= 0"); } buf = new byte[size]; } // 增强后的read方法:从缓冲数组中返回读取的字节数据 public synchronized int read() throws IOException { if (pos >= count) { fill(); if (pos >= count) return -1; } return getBufIfOpen()[pos++] & 0xff; } private byte[] getBufIfOpen() throws IOException { byte[] buffer = buf; if (buffer == null) throw new IOException("Stream closed"); return buffer; } protected volatile byte buf[]; // 内部缓冲输入数据的字节数组 }
标签:字节 bst crete 传递 类别 请求 ext print and
原文地址:http://www.cnblogs.com/lulipro/p/7677675.html