1. Decorator模式
不段地为对象增加装饰(功能)的设计模式被称为Decorator模式
1.1 Decorator模式的类图
登场的角色:
-
Component(组件)
增加功能时的核心角色。 -
ConcreteComponent
实现了Component角色所定义的接口 -
Decorator(装饰物)
与Component角色具有相同的接口。在它内部保存了被装饰的对象 -
ConcreteDecorator
具体的装饰物
1.2 示例程序
类一览表:
名称 | 说明 |
---|---|
Display | 用于显示字符串的抽象类 |
StringDisplay | 显示单行字符串 |
Border | 用于显示边框的抽象类 |
SideBorder | 装饰左右边框 |
FullBorder | 装饰上下左右边框 |
Main | 测试类 |
uml类图
Display类
package xin.ajay.decorator;
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));
}
}
}
StringDisplay类
package xin.ajay.decorator;
public class StringDisplay extends Display {
private String msg;
public StringDisplay(String msg) {
this.msg = msg;
}
@Override
public int getColumns() {
return msg.getBytes().length;
}
@Override
public int getRows() {
return 1;
}
@Override
public String getRowText(int row) {
if(row==0){
return msg;
}
return null;
}
}
Border类
package xin.ajay.decorator;
public abstract class Border extends Display {
protected Display display;
protected Border(Display display){
this.display = display;
}
}
SideBorder类
package xin.ajay.decorator;
public class SideBorder extends Border {
private char borderChar;
public SideBorder(Display display, char borderChar) {
super(display);
this.borderChar = borderChar;
}
@Override
public int getColumns() {
return 1 + display.getColumns() +1;
}
@Override
public int getRows() {
return display.getRows();
}
@Override
public String getRowText(int row) {
return borderChar + display.getRowText(row) + borderChar;
}
}
FullBorder类
package xin.ajay.decorator;
public class FullBorder extends Border {
protected FullBorder(Display display) {
super(display);
}
@Override
public int getColumns() {
return 1 + display.getColumns()+1;
}
@Override
public int getRows() {
return 1+display.getRows()+1;
}
@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(char c, int columns) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < columns; i++) {
builder.append(c);
}
return builder.toString();
}
}
Main类
package xin.ajay.decorator;
public class Main {
public static void main(String[] args) {
StringDisplay display = new StringDisplay("hello");
SideBorder b1 = new SideBorder(display, '#');
FullBorder b2 = new FullBorder(b1);
display.show();
b1.show();
b2.show();
}
}
结果
hello
#hello#
+-------+
|#hello#|
+-------+
鸣谢
GoF《设计模式》和结城浩的《图解设计模式》