Decorator模式(裝飾器模式)
阿新 • • 發佈:2018-12-17
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;
}
}