1. 程式人生 > >Decorator模式(裝飾器模式)

Decorator模式(裝飾器模式)

Decorator模式?

假如現在有一塊蛋糕,如果只塗上奶油,其他什麼都不加,就是奶油蛋糕。如果加上草莓,就是草莓奶油蛋糕。如果再加上一塊黑色巧克力板,上面用白色巧克力寫上姓名,然後插上代表年齡的蠟燭,就變成了一塊生日蛋糕 像這樣不斷地為物件新增裝飾的設計模式被稱為Decorator模式

  • 簡單描述:一個基礎共有的物件,你想賦予它什麼責者那麼你新增相關的職責修飾,這就是裝飾器模式
  • Java I/O 中使用介面卡的:

理清職責

作用:對普通的字串,通過加入邊框進行描述 名字============》》說明 Display ||| 用於顯示字串的抽象類 stringDisplay ||| 用於顯示單行字串的類 Border ||| 用於顯示裝飾邊框的抽象類 sideBorder ||| 用於只顯示左右邊框的類 Fu11Border ||| 用於顯示上下左右邊框的類 Main ||| 測試程式行為的類

  • 關係物件圖:

UML

Code

  • MainT
public class MainT {

    public static void main(String[] args) {

        Display display=new StringDisplay("hello decorator");

        display.show();

        Display display1=new SideBorder(display,'#');

        display1.show();

        Display fullBorder = new FullBorder(display1);

        fullBorder.show();

        Display display2=new SideBorder(
                new FullBorder(
                        new FullBorder(
                                new SideBorder(
                                        new FullBorder(
                                                new StringDisplay("Lets it go")
                                        ),
                                        '*'
                                )
                        )
                )
        ,'/');
        display2.show();



    }
}
  • Display
public abstract class Display {

    // 獲取橫向字元數
    public abstract int getColumns();

    // 獲取縱向行數
    public abstract int getRows();

    // 獲取row行字元
    public abstract String getRowText(int row);

    // 顯示
    public final void show(){
        for (int i = 0; i < getRows(); i++) {
            System.out.println(getRowText(i));
        }
    }

}


  • StringDisplay

public class StringDisplay extends Display {

    private String string;

    public StringDisplay(String string) {
        this.string = string;
    }

    @Override
    public int getColumns() {
        return string.getBytes().length;
    }

    @Override
    public int getRows() {
        return 1;
    }

    @Override
    public String getRowText(int row) {
        return row==0? string: null;
    }
}

  • FullBorder
public class FullBorder extends Border {


    public FullBorder(Display display) {
        super(display);
    }

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

    @Override
    public int getRows() {
        return display.getRows()+2;
    }

    @Override
    public String getRowText(int row) {

        if(row==0)
            return "+"+makeLine("-",display.getColumns())+"+";
        else if(row==display.getRows()+1)
            return "+"+makeLine("-",display.getColumns())+"+";
        else
            return "|"+display.getRowText(row-1)+"|";
    }

    private String makeLine(String s, int columns) {
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < columns; i++) {
            buffer.append(s);
        }
        return buffer.toString();
    }
}

  • SideBorder
public class SideBorder extends Border {

    private char aChar;

    public SideBorder(Display display,char ch) {
        super(display);
        this.aChar=ch;

    }

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

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

    @Override
    public String getRowText(int row) {
        return aChar+display.getRowText(row)+aChar;
    }
}