본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Decorator 패턴

오브젝트에 장식을 해 나가는 디자인 패턴

 


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