Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Decorator 본문

Java/디자인 패턴

Decorator

Seung__ 2021. 11. 9. 21:25

1. Decorator Pattern


  • 장식과 실제 내용물을 동일시
  • 객체에 동적으로 책임을 추가

 

 

2. 의도 (Intent)와 동기(Motivation)


  • 상속을 사용하지 않고 기능의 유연한 확장이 가능한 패턴
  • 객체에 동적으로 새로운 서비스를 추가 할 수 있음
  • 전체가 아닌 개별적인 객체에 새로운 기능을 추가 할 수 있음

 

 

 

3. Class Diagram


 

 

4. 객체 협력 (collaborations)


  • Component : 동적으로 추가할 서비스를 가질 수 있는 객체 정의
  • ConcreteComponent : 추가적인 서비스가 필요한 실제 객체
  • Decorator : Component의 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 정의
    • Decorator 는 Component를 참조하거나 또 다른 Decorator를 가지고 있어야 함.
  • ConcreteDecorator : 새롭게 추가되는 서비스를 실제 구현한 클래스로 addBehavior()를 구현한다.

 

 

5. 중요한 결론 (consequence)


  • 단순한 상속보다 설계의 융통성을 증대
  • Decorator의 조합을 통해 새로운 서비스를 지속적으로 추가할 수 있음
  • 필요없는 경우 Decorator를 삭제할 수 있음
  • Decorator와 실제 컴포넌트는 동일한 것이 아님
  • 작은 규모의 객체들이 많이 생성될 수 있음
  • 자바의 I/O 스트림 클래스는 Decorator 패턴임

 

 

 

6. 예제


public abstract class Coffee {

    public abstract void brewing();
}
public class KenyaCoffee extends Coffee{
    @Override
    public void brewing() {
        System.out.println("Kenya Coffee");
    }
}
  • Decorator가 추상클래스?????? new 로 인스턴스를 생성할 필요가 없음. 막아버림.
public abstract class Decorator extends Coffee{

    Coffee coffee;

    public Decorator(Coffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public void brewing() {
        coffee.brewing();
    }
}
  • ConcreteDecorator는 Decorator의 메서드를 호출하고 부가 기능을 제공한다.
public class Mocha extends Decorator{

    public Mocha(Coffee coffee) {
        super(coffee);
    }

    @Override
    public void brewing() {
        super.brewing();
        System.out.println("adding Mocha");
    }
}
public class Latte extends Decorator{

    public Latte(Coffee coffee) {
        super(coffee);
    }

    @Override
    public void brewing() {
        super.brewing();
        System.out.println("adding Milk");

    }
}
public class CoffeeTest {

    public static void main(String[] args) {

        Coffee kenyaCoffee = new KenyaCoffee();
        kenyaCoffee.brewing();
        System.out.println("=================");
        Latte kenyaLatte = new Latte(kenyaCoffee);
        kenyaLatte.brewing();
        System.out.println("=================");
        Mocha kenyaMochaLatte = new Mocha(kenyaLatte);
        kenyaMochaLatte.brewing();
        System.out.println("=================");
    }
}
Kenya Coffee
=================
Kenya Coffee
adding Milk
=================
Kenya Coffee
adding Milk
adding Mocha
=================

 

 

 

7. GitHub : 211109 Decorator Pattern


 

GitHub - bsh6463/designPattern

Contribute to bsh6463/designPattern development by creating an account on GitHub.

github.com

 

'Java > 디자인 패턴' 카테고리의 다른 글

Adapter Pattern  (0) 2021.11.09
Composite Pattern  (0) 2021.11.09
기능의 선언과 구현을 분리 - Bridge  (1) 2021.11.08
기능의 선언과 구현을 분리 - Strategy Pattern  (0) 2021.11.08
하위 클래스 위임 - Factory Method  (0) 2021.11.07
Comments