デコレーションモードで知っておきたいこと


デコレーションモードで知っておきたいこと
装飾モードのUML図:
                                                          
    public abstract class Display {
	public abstract int getColumns();
	
	public abstract int getRows();
	
	public abstract String getRowText(int row);
	// : ?
	public final void show(){
		 for(int i=0;i<getRows();i++){
			 System.out.println(getRowText(i));
		 }
	}
    }
    
    public class StringDisplay extends Display {

	public String str;

	public StringDisplay(String str) {

		this.str = str;
	}

	@Override
	public int getColumns() {

		return str.length();
	}

	@Override
	public int getRows() {

		return 1;
	}

	@Override
	public String getRowText(int row) {

		if (row == 0) {
			return str;
		}
		return null;
	}

    }
    
    // : , Display
    public abstract class Border extends Display {
	protected Display dis;
	
	protected Border( Display dis){
		
		this.dis=dis;
	}
    }
    
    // 
    public class SideBorder extends Border{

	private char borderchar;
	protected SideBorder(Display dis,char borderchar) {
		super(dis);
		this.borderchar=borderchar;
	 
	}

	@Override
	public int getColumns() {
		
		return 2+dis.getColumns();
	}

	@Override
	public int getRows() {
		 
		return dis.getRows();
	}

	@Override
	public String getRowText(int row) {
		 
		return borderchar +dis.getRowText(row)+borderchar;
	}

    }
    
    // :
    
    	        Display d1=new StringDisplay("nihao");
		d1.show();
		
		Display d2=new SideBorder(d1,'@');
		d2.show();
		
		
		Display d3=new SideBorder(d2,'@');
		d3.show();
     :
            nihao
            @nihao@
            @@nihao@@

このことから、装飾モードの思想の中で最も重要な点は、装飾類と被装飾類が共通の親類の継承から来ており、装飾類が親類の引用を持っていることである.また、親はテンプレートメソッドモードを用いる、装飾クラスは抽象化のみを行う.専用の具体的な装飾類が実現されています.
Java ioクラスバッグには、装飾クラスの巧みな運用があります.Reader,BufferReader感謝する学生はその実現に注目することができる.