오브젝트에 장식을 해 나가는 디자인 패턴
1. 코드
Item: 오브젝트와 장식을 모두 포함한 클래스
public abstract class Item {
public abstract int getColumns();
public abstract int getRows();
public abstract String getRowText(int row);
public final void show() {
int rows = getRows();
for (int i=0; i<rows; i++) {
System.out.println(getRowText(i));
}
}
}
Food: 오브젝트 중 1개
public class Food extends Item {
private String foodName;
public Food(String foodName) {
this.foodName = foodName;
}
@Override
public int getColumns() {
return foodName.length();
}
@Override
public int getRows() {
return 1;
}
@Override
public String getRowText(int row) {
return foodName;
}
}
TapingItem: 장식1 (item의 양 사이드에 '|'을 추가)
public class TapingItem extends Item {
private Item item;
public TapingItem(Item item) {
this.item = item;
}
@Override
public int getColumns() {
return item.getColumns() + 2;
}
@Override
public int getRows() {
return item.getRows();
}
@Override
public String getRowText(int row) {
return '|' + item.getRowText(row) + '|';
}
}
BoxingItem: 장식2 (item의 상하 좌우에 '+'를 추가)
public class BoxingItem extends Item {
private Item item;
public BoxingItem(Item item) {
this.item = item;
}
@Override
public int getColumns() {
return item.getColumns() + 2;
}
@Override
public int getRows() {
return item.getRows() + 2;
}
@Override
public String getRowText(int row) {
if (row == 0 || row == getRows() - 1) {
String result = "";
for (int i=0; i<getColumns(); i++) {
result += '+';
}
return result;
}
return '+' + item.getRowText(row-1) + '+';
}
}
Main : Test클래스
public class Main {
public static void main(String[] args) {
Item item1 = new Food("cake");
Item item2 = new TapingItem(item1);
Item item3 = new BoxingItem(item2);
Item item4 = new BoxingItem(
new BoxingItem(
new TapingItem(
new BoxingItem(
new Food("important cake")))));
item1.show();
item2.show();
item3.show();
item4.show();
}
}
2. 특징
- 장식에 있는 item은 장식 객체 일 수 있고, 기본 오브젝트(Food) 일 수 도 있다.
- 기본 오브젝트와 장식을 같은 부모 클래스로 묶고, 장식안에 있는 item은 위임으로 연결한다.
- 장식의 메소드들은 재귀적으로 호출 되며 장식 내부의 item이 어떤 형태인지는 알 필요 없다.
- 다양한 장식을 추가 하고 조합할 수 있다.
3. 해당 패턴을 고려해볼만한 상황
- base 기능에 여러 추가 기능이 예상 될때
- 추가 기능들이 순서없이 복합적으로 사용이 필요 할 때
- 클라이언트 화면을 구성할 때
'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글
Chain Of Responsibility 패턴 (0) | 2021.02.11 |
---|---|
Visitor 패턴 (0) | 2021.02.07 |
Composite 패턴 (0) | 2021.01.24 |
strategy 패턴 (0) | 2021.01.24 |
Bridge 패턴 (0) | 2021.01.17 |