装饰者模式里面必须要知道的事情

                     装饰模式必须要知道的事情

装饰模式的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感谢的同学可以关注其实现。

你可能感兴趣的:(装饰者模式,同一父类,具体装饰者实现)