티스토리 뷰

반응형

데코레이터 패턴 (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()); //기본빵+불고기패티+불고기패티에 새우패티 추가
        
    }
}

실제로 데코레이터 패턴을 사용하는 메인영역입니다. 기본 빵을 시작으로 하여 프로그램내에서 동적으로 새로운재료를 추가 할 수 있습니다.

 

 

 

 

 

반응형