Decorator模式(装饰器模式)
原创
©著作权归作者所有:来自51CTO博客作者信息所话事人的原创作品,请联系作者获取转载授权,否则将追究法律责任
Decorator模式?
假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕。如果加上草莓,就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕
像这样不断地为对象添加装饰的设计模式被称为Decorator模式
- 简单描述:一个基础共有的对象,你想赋予它什么责者那么你添加相关的职责修饰,这就是装饰器模式
- Java I/O 中使用适配器的:
理清职责
作用:对普通的字符串,通过加入边框进行描述
名字============》》说明
Display ||| 用于显示字符串的抽象类
stringDisplay ||| 用于显示单行字符串的类
Border ||| 用于显示装饰边框的抽象类
sideBorder ||| 用于只显示左右边框的类
Fu11Border ||| 用于显示上下左右边框的类
Main ||| 测试程序行为的类
UML
Code
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();
}
}
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));
}
}
}
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;
}
}
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();
}
}
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;
}
}