본문 바로가기
Computer Science/Theory-Java

[Java] 자바 디자인패턴 #3 - Decorator Pattern

by M-life 2016. 6. 27.
반응형

3. Decorator Pattern : 


 - 객체에 추가 요소를 동적으로 더할 수 있다.

 - 데코레이터 패턴을 사용하면 서브 클래스를 만드는 경우에 비해 훨씬 유연하게 기능을 확장할 수 있다.

 - 특정 요소의 형식을 알아내서 그 결과를 바탕으로 작업해야 하는 코드에는 적합하지 않다.

 - 데코레이터는 팩토리나 빌더 같은 다른 패턴을 써서 사용되는 경우가 많다.




1. Beverage.java(Abstract Class)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package chap3;
 
public abstract class Beverage {
    
    String desc = "No name";
 
    public String getDesc(){
        return desc;
    }
 
    public abstract double cost();
 
    public String toString() {
        return getDesc()+" : "+ cost();
    }
    
}
 
cs



2. CodimentDecorator(Abstract Class)


1
2
3
4
5
6
7
package chap3;
 
public abstract class CodimentDecorator extends Beverage {
    // 모든 첨가물(Decorator)에서 강제 Override 하도록 만듬
    public abstract String getDesc();
}
 
cs


3. Espresso.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package chap3;
 
public class Espresso extends Beverage{
 
    public Espresso() {
        desc = "Espresso";
    }
    
    @Override
    public double cost() {
        // TODO Auto-generated method stub
        return 1.99;
    }
 
}
 
cs



4. Milk.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package chap3;
 
public class Milk extends CodimentDecorator{
 
    private Beverage beverage;
    
    public Milk(Beverage b) {
        this.beverage = b;
    }
    
    @Override
    public String getDesc() {
        // TODO Auto-generated method stub
        return beverage.getDesc() + ", Milk";
    }
 
    @Override
    public double cost() {
        // TODO Auto-generated method stub
        return beverage.cost() + .1;
    }
 
}
 
cs



5. CoffeeShop.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package chap3;
 
public class CoffeeShop {
 
    public static void main(String[] args) {
 
        Beverage b1 = new Espresso();
        System.out.println(b1.toString());
 
        b1 = new Mocha(b1);
        b1 = new Milk(b1);
        System.out.println(b1.toString());
 
        Beverage b2 = new HouseBlend();
        System.out.println(b2.toString());
 
        b2 = new Whip(b2);
        System.out.println(b2.toString());
    }
}
 
cs


반응형

댓글