JAva装飾デザインモデルの由来


装飾設計モード:既存の機能に基づいて、強化された機能を提供する
装飾デザインパターンの由来:
Reader
  ----TextReader
 ----MediaReader
サブクラスにバッファリード機能を提供するには
Reader
  ----TextReader
       ----BufferedTextReader
  ----MediaReader
      -----BufferedMediaReader
Reader
  ----TextReader
       ----BufferedTextReader
  ----MediaReader
      -----BufferedMediaReader
  ----OtherReader
      -----BufferedOtherReader
 
バッファリード機能を提供する以上,この機能を抽出し,クラスを個別に定義することができる.
効率を向上させる必要がある人は,パラメータとしてこのクラスの構造方法に渡す.
class BufferedReader
{
   privateReader r;
 
   publicBufferedReader(Reader r)
   {
         this.r = r;
   }
}
このシステムは次のようになります.
Reader
  ----TextReader
  ----MediaReader
  ----OtherReader
  ----BufferedReader
   
 装飾デザインの特徴:
 1:既存の機能に基づいて強化された機能を提供するため、元のシステムに属する
 2:システムが単純化された
例:
import java.io.*;
//  LineNumberReader
class MyBufferedReader //extends Reader
{
	private Reader r;//         
	private char[] arr = new char[1024];//      
	private int index;//       
	private int count;//         

	public MyBufferedReader(Reader r)
	{
		this.r = r;
	}

	//            
	public int myRead()throws IOException
	{
	   //          ,            
	   if(count==0)
		{
	        count = r.read(arr);//            ,            
            index = 0;//     0,          ,   0   
	    }
		if(count<0)
			return -1;
		//          
		int num = arr[index];
		//   1
		index++;
		//   1
		count--;

		return num;
	}
	//          
	//    myRead(),         ,        
	public String myReadLine()throws IOException
	{
		  //  StringBuilder    
		  StringBuilder sb = new StringBuilder();
          int ch;
		  while((ch=myRead())!=-1)
		  {
		      if(ch=='\r')
				  continue;
			  else if(ch=='
') return sb.toString(); else sb.append((char)ch); } return null; } public void myClose()throws IOException { r.close(); } } class MyLineNumberReader extends MyBufferedReader { private int lineNumber; public MyLineNumberReader(Reader r) { super(r); } public void setLineNumber(int lineNumber) { this.lineNumber = lineNumber; } public int getLineNumber() { return this.lineNumber; } public String myReadLine()throws IOException { ++lineNumber; return super.myReadLine(); } } class Demo7 { public static void main(String[] args)throws IOException { FileReader fr = new FileReader("Demo5.java"); // MyLineNumberReader lnr = new MyLineNumberReader(fr); String line = null; lnr.setLineNumber(99); while((line = lnr.myReadLine())!=null) { System.out.println(lnr.getLineNumber()+":"+line); } lnr.myClose(); } }

1)継承は拡張形式の1つに属するが,弾性設計に至る最良の方法とは限らない.
2)設計では,既存のコードを変更することなく動作を拡張できるようにするべきである.
3)組合せおよび委任は、実行時に新しい動作を動的に追加するために使用することができる.
4)継承に加えて,装飾者モードも動作を拡張することができる.
5)装飾者パターンは、特定の構成要素を包装するために使用される装飾者クラスを意味する.
6)装飾者クラスは、装飾されたコンポーネントタイプを反映する(実際には、インタフェースまたは継承によって実現される同じタイプを有する).
7)装飾者は、被装飾者の行為の前および/または後に自分の行為を加えることができ、さらには被装飾者の行為全体を置換して特定の目的を達成することができる.
8)無数の装飾者で1つのコンポーネントを包装することができる.
9)デザイナは、一般に、コンポーネントの特定のタイプに依存しない限り、コンポーネントの顧客に対して透明である.
10)装飾家はデザインに多くの小さなオブジェクトを生み出し,使いすぎるとプログラムが複雑になる.