ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>日本不卡中文字幕,精品乱子伦一区二区三区,久久美女艺术照精彩视频福利播放http://www.aygfsteel.com/eric0326/java技术,软äšg工程åQŒå¼€æºç›¸å…?/description>zh-cnSun, 13 Jul 2025 17:29:44 GMTSun, 13 Jul 2025 17:29:44 GMT60Java IO 包中的Decorator模式http://www.aygfsteel.com/eric0326/archive/2006/01/10/27349.html¾U¢ç‹¾U¢ç‹Tue, 10 Jan 2006 03:16:00 GMThttp://www.aygfsteel.com/eric0326/archive/2006/01/10/27349.htmlhttp://www.aygfsteel.com/eric0326/comments/27349.htmlhttp://www.aygfsteel.com/eric0326/archive/2006/01/10/27349.html#Feedback0http://www.aygfsteel.com/eric0326/comments/commentRss/27349.htmlhttp://www.aygfsteel.com/eric0326/services/trackbacks/27349.html


Java IO 包中的Decorator模式

JDK为程序员提供了大量的¾cÕdº“åQŒè€Œäؓ了保持类库的可重用性,可扩展性和灉|´»æ€§ï¼Œå…¶ä¸­ä½¿ç”¨åˆîCº†å¤§é‡çš„设计模式,本文ž®†ä»‹¾lJDKçš„I/O包中使用到的Decorator模式åQŒåƈ˜qç”¨æ­¤æ¨¡å¼ï¼Œå®žçŽ°ä¸€ä¸ªæ–°çš„è¾“å‡ºæµ¾c…R€?

  Decorator模式½Ž€ä»?

  Decorator模式又名包装å™?Wrapper)åQŒå®ƒçš„主要用途在于给一个对象动态的æ·ÕdŠ ä¸€äº›é¢å¤–çš„èŒè´£ã€‚ä¸Žç”Ÿæˆå­ç±»ç›¸æ¯”åQŒå®ƒæ›´å…·æœ‰çµ‹zÀL€§ã€?br> æœ? æ—¶å€™ï¼Œæˆ‘ä»¬éœ€è¦äØ“ä¸€ä¸ªå¯¹è±¡è€Œä¸æ˜¯æ•´ä¸ªç±»æ·ÕdŠ ä¸€äº›æ–°çš„åŠŸèƒ½ï¼Œæ¯”å¦‚åQŒç»™ä¸€ä¸ªæ–‡æœ¬åŒºæ·ÕdŠ ä¸€ä¸ªæ»šåŠ¨æ¡çš„åŠŸèƒ½ã€‚æˆ‘ä»¬å¯ä»¥ä‹É用ç‘ô承机制来实现˜q™ä¸€åŠŸèƒ½åQŒä½†æ˜¯è¿™¿Uæ–¹æ³•不 够灵‹z»ï¼Œæˆ‘们无法控制文本区加滚动条的方式和时机。而且当文本区需要添加更多的功能æ—Óž¼Œæ¯”如è¾ÒŽ¡†½{‰ï¼Œéœ€è¦åˆ›å»ºæ–°çš„ç±»åQŒè€Œå½“需要组合ä‹É用这些功能时无疑ž®†ä¼š 引è“v¾cȝš„爆炸ã€?br>
  我们可以使用一¿Uæ›´ä¸ºçµ‹zÈš„æ–ÒŽ³•åQŒå°±æ˜¯æŠŠæ–‡æœ¬åŒºåµŒå…¥åˆ°æ»šåŠ¨æ¡ä¸­ã€‚è€Œè¿™ä¸ªæ»šåŠ¨æ¡çš„ç±»ž®Þq›¸å½“于å¯ÒŽ–‡æœ¬åŒºçš„一个装饰。这个装 é¥?滚动æ?必须与被装饰的组ä»?文本åŒ?¾l§æ‰¿è‡ªåŒä¸€ä¸ªæŽ¥å£ï¼Œ˜q™æ ·åQŒç”¨æˆ·å°±ä¸å¿…å…›_¿ƒè£…饰的实玎ͼŒå› äØ“˜q™å¯¹ä»–们来说是透明的。装é¥îC¼šž®†ç”¨æˆïLš„è¯äh±‚转发¾l™ç›¸åº? 的组ä»?卌™°ƒç”¨ç›¸å…³çš„æ–ÒŽ³•)åQŒåƈ可能在è{发的前后做一些额外的动作(如添加滚动条)。通过˜q™ç§æ–ÒŽ³•åQŒæˆ‘们可以根据组合对文本区嵌套不同的装饰åQŒä»Žè€Œæ·»åŠ ä“Q 意多的功能。这¿UåŠ¨æ€çš„å¯¹å¯¹è±¡æ·»åŠ åŠŸèƒ½çš„æ–ÒŽ³•不会引è“v¾cȝš„爆炸åQŒä¹Ÿå…ähœ‰äº†æ›´å¤šçš„灉|´»æ€§ã€?br>
  以上的方法就是Decorator模式åQŒå®ƒé€šè¿‡¾l™å¯¹è±¡æ·»åŠ è£…é¥°æ¥åŠ¨æ€çš„æ·ÕdŠ æ–°çš„åŠŸèƒ½ã€‚å¦‚ä¸‹æ˜¯Decorator模式的UML图:


Component为组件和装饰的公å…Þqˆ¶¾c»ï¼Œå®ƒå®šä¹‰äº†å­ç±»å¿…须实现的方法ã€?br>
  ConcreteComponent是一个具体的¾l„äšg¾c»ï¼Œå¯ä»¥é€šè¿‡¾l™å®ƒæ·ÕdŠ è£…é¥°æ¥å¢žåŠ æ–°çš„åŠŸèƒ½ã€?br>
  Decorator是所有装饰的公共父类åQŒå®ƒå®šä¹‰äº†æ‰€æœ‰è£…饰必™åÕd®žçŽ°çš„æ–ÒŽ³•åQŒåŒæ—Óž¼Œå®ƒè¿˜ä¿å­˜äº†ä¸€ä¸ªå¯¹äºŽComponent的引用,以便ž®†ç”¨æˆïLš„è¯äh±‚转发¾l™ComponentåQŒåƈ可能在è{发请求前后执行一些附加的动作ã€?br>
  ConcreteDecoratorAå’ŒConcreteDecoratorB是具体的装饰åQŒå¯ä»¥ä‹É用它们来装饰具体的Componentã€?br>
  Java IO包中的Decorator模式

  JDK提供的java.io包中使用了Decorator模式来实现对各种输入输出‹¹çš„ž®è£…。以下将以java.io.OutputStream及其子类ä¸ÞZ¾‹åQŒè®¨è®ÞZ¸€ä¸‹Decorator模式在IO中的使用ã€?br>
  首先来看一ŒD는¨æ¥åˆ›å»ºIO‹¹çš„代码åQ?br>

以下是代码片ŒDµï¼š
try {
 OutputStream out = new DataOutputStream(new FileOutputStream("test.txt"));
} catch (FileNotFoundException e) {
 e.printStackTrace();
}

   ˜q™æ®µä»£ç å¯¹äºŽä½¿ç”¨˜q‡JAVA输入输出‹¹çš„人来说再熟悉不过了,我们使用DataOutputStreamž®è£…了一个FileOutputStreamã€? ˜q™æ˜¯ä¸€ä¸ªå…¸åž‹çš„Decorator模式的ä‹É用,FileOutputStream相当于ComponentåQŒDataOutputStreamž®±æ˜¯ä¸€ä¸? Decorator。将代码æ”ÒŽˆå¦‚下åQŒå°†ä¼šæ›´å®ÒŽ˜“理解åQ?br>

以下是代码片ŒDµï¼š
try {
 OutputStream out = new FileOutputStream("test.txt");
 out = new DataOutputStream(out);
} catch(FileNotFoundException e) {
 e.printStatckTrace();
}

  ç”׃ºŽFileOutputStreamå’ŒDataOutputStream有公å…Þqš„父类OutputStreamåQŒå› æ­¤å¯¹å¯¹è±¡çš„装饰对于用æˆäh¥è¯´å‡ ä¹Žæ˜¯é€æ˜Žçš„。下面就来看看OutputStream及其子类是如何构成Decorator模式的:

OutputStream是一个抽象类åQŒå®ƒæ˜¯æ‰€æœ‰è¾“出流的公å…Þqˆ¶¾c»ï¼Œå…¶æºä»£ç å¦‚下åQ?


以下是代码片ŒDµï¼š
public abstract class OutputStream implements Closeable, Flushable {
public abstract void write(int b) throws IOException;
...
}

它定义了write(int b)的抽象方法。这相当于Decorator模式中的Component¾c…R€?

ByteArrayOutputStreamåQŒFileOutputStream å’?PipedOutputStream 三个¾c»éƒ½ç›´æŽ¥ä»ŽOutputStream¾l§æ‰¿åQŒä»¥ByteArrayOutputStreamä¸ÞZ¾‹åQ?


以下是代码片ŒDµï¼š
public class ByteArrayOutputStream extends OutputStream {
protected byte buf[];
protected int count;
public ByteArrayOutputStream() {
this(32);
}
public ByteArrayOutputStream(int size) {
if (size �0) {
throw new IllegalArgumentException("Negative initial size: " + size);
}
buf = new byte[size];
}
public synchronized void write(int b) {
int newcount = count + 1;
if (newcount �buf.length) {
byte newbuf[] = new byte[Math.max(buf.length 〈�1, newcount)];
System.arraycopy(buf, 0, newbuf, 0, count);
buf = newbuf;
}
buf[count] = (byte)b;
count = newcount;
}
...
}

它实çŽîCº†OutputStream中的write(int b)æ–ÒŽ³•åQŒå› æ­¤æˆ‘ä»¬å¯ä»¥ç”¨æ¥åˆ›å»ø™¾“出流的对象,òq¶å®Œæˆç‰¹å®šæ ¼å¼çš„输出。它相当于Decorator模式中的ConcreteComponent¾c…R€?

接着来看一下FilterOutputStreamåQŒä»£ç å¦‚下:


以下是代码片ŒDµï¼š
public class FilterOutputStream extends OutputStream {
protected OutputStream out;
public FilterOutputStream(OutputStream out) {
this.out = out;
}
public void write(int b) throws IOException {
out.write(b);
}
...
}

å? æ øP¼Œå®ƒä¹Ÿæ˜¯ä»ŽOutputStream¾l§æ‰¿ã€‚但是,它的构造函数很特别åQŒéœ€è¦ä¼ é€’一个OutputStream的引用给它,òq¶ä¸”它将保存å¯ÒŽ­¤å¯¹è±¡çš„引用ã€? 而如果没有具体的OutputStream对象存在åQŒæˆ‘们将无法创徏FilterOutputStream。由于out既可以是指向 FilterOutputStream¾cÕdž‹çš„引用,也可以是指向ByteArrayOutputStream½{‰å…·ä½“输出流¾cȝš„引用åQŒå› æ­¤ä‹É用多层嵌套的æ–? 式,我们可以为ByteArrayOutputStreamæ·ÕdŠ å¤šç§è£…é¥°ã€‚è¿™ä¸ªFilterOutputStream¾cȝ›¸å½“于Decorator模式中的 Decorator¾c»ï¼Œå®ƒçš„write(int b)æ–ÒŽ³•只是½Ž€å•的调用了传入的‹¹çš„write(int b)æ–ÒŽ³•åQŒè€Œæ²¡æœ‰åšæ›´å¤šçš„处理,因此它本质上没有å¯Ò޵˜q›è¡Œè£…饰åQŒæ‰€ä»¥ç‘ô承它的子¾cÕd¿…™å»è¦†ç›–æ­¤æ–ÒŽ³•åQŒä»¥è¾‘Öˆ°è£…饰的目的ã€?

BufferedOutputStream å’? DataOutputStream是FilterOutputStream的两个子¾c»ï¼Œå®ƒä»¬ç›¸å½“于Decorator模式中的 ConcreteDecoratoråQŒåƈ对传入的输出‹¹åšäº†ä¸åŒçš„装饰。以BufferedOutputStream¾cÖMؓ例:


以下是代码片ŒDµï¼š
public class BufferedOutputStream extends FilterOutputStream {
...
private void flushBuffer() throws IOException {
if (count �0) {
out.write(buf, 0, count);
count = 0;
}
}
public synchronized void write(int b) throws IOException {
if (count � buf.length) {
flushBuffer();
}
buf[count++] = (byte)b;
}
...
}



   ˜q™ä¸ª¾cÀLä¾›äº†ä¸€ä¸ªç¼“存机åˆÓž¼Œ½{‰åˆ°¾~“存的容量达åˆîC¸€å®šçš„字节数时才写入输出流。首先它¾l§æ‰¿äº†FilterOutputStreamåQŒåƈ且覆盖了父类çš? write(int b)æ–ÒŽ³•åQŒåœ¨è°ƒç”¨è¾“出‹¹å†™å‡ºæ•°æ®å‰éƒ½ä¼š‹‚€æŸ¥ç¼“存是否已满,如果未满åQŒåˆ™ä¸å†™ã€‚这样就实现了对输出‹¹å¯¹è±¡åŠ¨æ€çš„æ·ÕdŠ æ–°åŠŸèƒ½çš„ç›®çš„ã€?br>
  下面åQŒå°†ä½¿ç”¨Decorator模式åQŒäØ“IO写一个新的输出流ã€?br>
  自己写一个新的输出流

   了解了OutputStream及其子类的结构原理后åQŒæˆ‘们可以写一个新的输出流åQŒæ¥æ·ÕdŠ æ–°çš„åŠŸèƒ½ã€‚è¿™éƒ¨åˆ†ä¸­å°†¾l™å‡ºä¸€ä¸ªæ–°çš„输出流的例子,它将˜q‡æ×o待输 凸™¯­å¥ä¸­çš„空格符受÷€‚比如需要输å‡?java io OutputStream"åQŒåˆ™˜q‡æ×o后的输出ä¸?javaioOutputStream"ã€‚ä»¥ä¸‹äØ“SkipSpaceOutputStream¾cȝš„代码åQ?br>

以下是代码片ŒDµï¼š
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* A new output stream, which will check the space character
* and won’t write it to the output stream.
* @author Magic
*
*/
public class SkipSpaceOutputStream extends FilterOutputStream {
 public SkipSpaceOutputStream(OutputStream out) {
  super(out);
 }
 /**
 * Rewrite the method in the parent class, and
 * skip the space character.
 */
 public void write(int b) throws IOException{
  if(b!=��{
   super.write(b);
  }
 }
}

  它从FilterOutputStream¾l§æ‰¿åQŒåƈ且重写了它的write(int b)æ–ÒŽ³•。在write(int b)æ–ÒŽ³•中首先对输入字符˜q›è¡Œäº†æ£€æŸ¥ï¼Œå¦‚果不是½Iºæ ¼åQŒåˆ™è¾“出ã€?br>
  以下是一个测试程序:


以下是代码片ŒDµï¼š
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Test the SkipSpaceOutputStream.
* @author Magic
*
*/
public class Test {
 public static void main(String[] args){
  byte[] buffer = new byte[1024];

  /**
  * Create input stream from the standard input.
  */
  InputStream in = new BufferedInputStream(new DataInputStream(System.in));

  /**
  * write to the standard output.
  */
  OutputStream out = new SkipSpaceOutputStream(new DataOutputStream(System.out));

  try {
   System.out.println("Please input your words: ");
   int n = in.read(buffer,0,buffer.length);
   for(int i=0;i〈n;i++){
    out.write(buffer[i]);
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

  执行以上‹¹‹è¯•½E‹åºåQŒå°†è¦æ±‚用户在console½H—口中输入信息,½E‹åºž®†è¿‡æ»¤æŽ‰ä¿¡æ¯ä¸­çš„½Iºæ ¼åQŒåƈž®†æœ€åŽçš„¾l“果输出到console½H—口。比如:


以下是引用片ŒDµï¼š
Please input your words:
a b c d e f
abcdef

  æ€?¾l?br>
   在java.io包中åQŒä¸ä»…OutputStream用到了Decorator设计模式åQŒInputStreamåQŒReaderåQŒWriter½{‰éƒ½ç”¨åˆ° 了此模式。而作ä¸ÞZ¸€ä¸ªçµ‹zȝš„åQŒå¯æ‰©å±•的类库,JDK中ä‹É用了大量的设计模式,比如在Swing包中的MVC模式åQŒRMI中的Proxy模式½{‰ç­‰ã€‚对äº? JDK中模式的研究不仅能加深对于模式的理解åQŒè€Œä¸”˜q˜æœ‰åˆ©äºŽæ›´é€å½»çš„了解类库的¾l“构和组成ã€?br>
转自åQ?a target="_blank" >http://www.java-cn.com/technology/technology_detail.jsp?id=3976

]]>
开始小论文http://www.aygfsteel.com/eric0326/archive/2005/09/17/13247.html¾U¢ç‹¾U¢ç‹Sat, 17 Sep 2005 12:38:00 GMThttp://www.aygfsteel.com/eric0326/archive/2005/09/17/13247.htmlhttp://www.aygfsteel.com/eric0326/comments/13247.htmlhttp://www.aygfsteel.com/eric0326/archive/2005/09/17/13247.html#Feedback0http://www.aygfsteel.com/eric0326/comments/commentRss/13247.htmlhttp://www.aygfsteel.com/eric0326/services/trackbacks/13247.html å¥½ä¹…没有来了


]]>
回到了西å®?/title><link>http://www.aygfsteel.com/eric0326/archive/2005/08/24/10942.html</link><dc:creator>¾U¢ç‹</dc:creator><author>¾U¢ç‹</author><pubDate>Wed, 24 Aug 2005 10:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/eric0326/archive/2005/08/24/10942.html</guid><wfw:comment>http://www.aygfsteel.com/eric0326/comments/10942.html</wfw:comment><comments>http://www.aygfsteel.com/eric0326/archive/2005/08/24/10942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/eric0326/comments/commentRss/10942.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/eric0326/services/trackbacks/10942.html</trackback:ping><description><![CDATA[<P>回来的感觉真å¥?/P><img src ="http://www.aygfsteel.com/eric0326/aggbug/10942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/eric0326/" target="_blank">¾U¢ç‹</a> 2005-08-24 18:07 <a href="http://www.aygfsteel.com/eric0326/archive/2005/08/24/10942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">Ó¢¼ªÉ³ÏØ</a>| <a href="http://" target="_blank">ƽ¹ÈÇø</a>| <a href="http://" target="_blank">¿ÂÆºÏØ</a>| <a href="http://" target="_blank">ÊÙÑôÏØ</a>| <a href="http://" target="_blank">ÄÂÀâÊÐ</a>| <a href="http://" target="_blank">̨ÄÏÊÐ</a>| <a href="http://" target="_blank">Ì¨Ç°ÏØ</a>| <a href="http://" target="_blank">¾°Äþ</a>| <a href="http://" target="_blank">¸§ÖÝÊÐ</a>| <a href="http://" target="_blank">èï´¨ÏØ</a>| <a href="http://" target="_blank">Äϵ¤ÏØ</a>| <a href="http://" target="_blank">³µéÏØ</a>| <a href="http://" target="_blank">ÎÂÖÝÊÐ</a>| <a href="http://" target="_blank">ÓÀ¶¨ÏØ</a>| <a href="http://" target="_blank">ÉÇÍ·ÊÐ</a>| <a href="http://" target="_blank">´óÀíÊÐ</a>| <a href="http://" target="_blank">ÓñϪÊÐ</a>| <a href="http://" target="_blank">¸»Ë³ÏØ</a>| <a href="http://" target="_blank">ÖÐÄþÏØ</a>| <a href="http://" target="_blank">ÇìÑôÊÐ</a>| <a href="http://" target="_blank">³¤´ºÊÐ</a>| <a href="http://" target="_blank">¶«¸ÛÊÐ</a>| <a href="http://" target="_blank">¸ÊµÂÏØ</a>| <a href="http://" target="_blank">×ÛÒÕ</a>| <a href="http://" target="_blank">»ù¡ÊÐ</a>| <a href="http://" target="_blank">ÀóÆÖÏØ</a>| <a href="http://" target="_blank">¸§ÖÝÊÐ</a>| <a href="http://" target="_blank">ÆÁ¶«ÏØ</a>| <a href="http://" target="_blank">Ôö³ÇÊÐ</a>| <a href="http://" target="_blank">ÒÀÀ¼ÏØ</a>| <a href="http://" target="_blank">Ïã¸ñÀïÀ­ÏØ</a>| <a href="http://" target="_blank">°¢À­ÉÆ×óÆì</a>| <a href="http://" target="_blank">Òí³ÇÏØ</a>| <a href="http://" target="_blank">Ïå³ÇÏØ</a>| <a href="http://" target="_blank">¾¸Ô¶ÏØ</a>| <a href="http://" target="_blank">Î÷Ï¿ÏØ</a>| <a href="http://" target="_blank">äųØÏØ</a>| <a href="http://" target="_blank">ÑǶ«ÏØ</a>| <a href="http://" target="_blank">½­´¨ÏØ</a>| <a href="http://" target="_blank">´ëÇÚÏØ</a>| <a href="http://" target="_blank">ºìÔ­ÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>