Design Pattern - Decorator
1. 클래스다이어그램
2. Source
1. 클래스다이어그램

- Display.java
package com.dazzilove.decorator.sample1;
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; iSystem.out.println(getRowText(i));
}
}
} - StringDisplay.java
package com.dazzilove.decorator.sample1;
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) {
if(row == 0) {
return string;
} else {
return null;
}
}
} - Border.java
package com.dazzilove.decorator.sample1;
public abstract class Border extends Display {
protected Display display;
protected Border(Display display) {
this.display = display;
}
} - SideBorder.java
package com.dazzilove.decorator.sample1;
public class SideBorder extends Border {
private char borderChar;
public SideBorder(Display display, char ch) {
super(display);
this.borderChar = ch;
}
@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.java
package com.dazzilove.decorator.sample1;
public class FullBorder extends Border {
public 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 ch, int count) {
StringBuffer sb = new StringBuffer();
for(int i=0; isb.append(ch);
}
return sb.toString();
}
} - Main.java
package com.dazzilove.decorator.sample1;
public class Main {
public static void main(String[] args) {
Display display1 = new StringDisplay("Hello, world.");
display1.show();
System.out.println("");
Display display2 = new SideBorder(display1, '#');
display2.show();
System.out.println("");
Display display3 = new FullBorder(display2);
display3.show();
System.out.println("");
Display display4 = new SideBorder(new FullBorder(new FullBorder(new SideBorder(new FullBorder(new StringDisplay("안녕하세요")), '*'))), '/');
display4.show();
}
}




덧글