티스토리 뷰
데코레이터 패턴 (Decorator Patter)
중심이 되는 객체에 부가적인 기능을 동적으로 추가하고자 할 때 사용하는 패턴입니다.
■ 데코레이턴 패턴 구조 (예제)
예제는 기본 빵 객체를 대상으로 여러가지 재료를 조합하여 동적으로 햄버거를 만드는 예제입니다.
● Hamburger : 장식할 대상이 가져야 할 공통 인터페이스를 정의합니다.
● Bread : 구체적인 장식 할 대상입니다. 다른 장식 대상을 장식 할 수는 없습니다.
● Ingredient : 장식 할 대상을 장식하는 클래스로 또한 Hamburger의 인터페이스를 가지기 때문에 장식 대상이 될 수도 있습니다. 장식 할 대상의 객체를 참조합니다.
●Shrimps_Patty 와 Bulgogi_Patty : Ingredient의 인터페이스를 구현 (예제에서는 상위 생성자 호출만 함)하고
부가적인 get_Current_Ingredient() 메서드를 구현합니다. ( 실제로 장식을 하는 행위)
■ 소스코드
Hamburger
1
2
3
4 |
public abstract class Hamburger {
//장식 할 대상과 장식자가 공통으로 가져야 할 인터페이스를 정의합니다.
public abstract String get_Current_Ingredient();
} |
장식 할 대상과 장식자가 공통으로 가져야 할 인터페이스를 정의합니다.
Bread
1
2
3
4
5
6
7 |
public class Bread extends Hamburger{
public String Current_Ingredient = "기본 빵";
public String get_Current_Ingredient()
{
return Current_Ingredient;
}
} |
장식 할 대상인 빵 클래스입니다. 아무런 장식도 되어 있지 않은 빵만 가지고 있는 상태입니다.
Ingredient
1
2
3
4
5
6
7
8 |
public abstract class Ingredient extends Hamburger {
public Hamburger hamburger; //장식 대상 Bread의 상위 클래스를 참조
public Ingredient(Hamburger hamburger)
{
this.hamburger = hamburger; //생성자 인자로 들어온 Hamburger를 참조
}
} |
장식자가 가져야 할 인터페이스를 정의합니다. 또한 장식자이면서 장식 당하는 대상이기도 하기 때문에 Bread의 상위 클래스인 Hamburger 클래스를 참조합니다.
Bulgogi_Patty 와 shrimp_Patty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
public class Bulgogi_Patty extends Ingredient{
public Bulgogi_Patty(Hamburger hamburger)
{
super(hamburger);
}
public String get_Current_Ingredient()
{
return hamburger.get_Current_Ingredient() + "+" +"불고기 패티";
}
}
public class Shrimps_Patty extends Ingredient{
public Shrimps_Patty(Hamburger hamburger)
{
super(hamburger);
}
public String get_Current_Ingredient()
{
return hamburger.get_Current_Ingredient() + "+" + "새우 패티";
}
} |
장식자들입니다. 기본 빵에 불고기패티와 새우패티를 추가하는 부분을 구현합니다.
Main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
public class Main {
public static void main(String argsp[])
{
Hamburger hamburger = new Bread();
System.out.println(hamburger.get_Current_Ingredient()); //아무런 장식이 더해지지 않은 빵만 있는 형태
Hamburger hamburger2 = new Bulgogi_Patty(hamburger);
System.out.println(hamburger2.get_Current_Ingredient()); //기본빵에 불고기패티를 추가하는 형태
Hamburger hamburger3 = new Bulgogi_Patty(hamburger2);
System.out.println(hamburger3.get_Current_Ingredient()); //기본빵+불고기패티에 불고기 패티를 추가
Hamburger hamburger4 = new Shrimps_Patty(hamburger3);
System.out.println(hamburger4.get_Current_Ingredient()); //기본빵+불고기패티+불고기패티에 새우패티 추가
}
} |
실제로 데코레이터 패턴을 사용하는 메인영역입니다. 기본 빵을 시작으로 하여 프로그램내에서 동적으로 새로운재료를 추가 할 수 있습니다.
'Study > 디자인 패턴' 카테고리의 다른 글
15 옵저버 패턴 (Observer Pattern) (0) | 2017.11.04 |
---|---|
14 메멘토 패턴 (Memento Pattern) (0) | 2017.10.20 |
12 방문자 패턴 (Visitor Pattern) (0) | 2017.10.11 |
11 컴포지트 패턴 (Composite Pattern) (0) | 2017.09.30 |
10 역할 사슬 패턴 (Chain Of Responsibility) (0) | 2017.09.28 |