본문 바로가기
public void static main()/Design Pattern

[Design Pattern] Decorator Pattern

by 햄리뮤 2021. 11. 16.
반응형

어제도 열심히 했고 오늘도 열심히 하기 위해서 너어어어어무 놀고싶고 쉬고싶지만

공부를 하기 위해서 컴퓨터에 앉았다 너무 기특해 림아 너모 기특해~

 

https://refactoring.guru/design-patterns/decorator

Decorator Pattern?

클래스의 코드를 전혀 바꾸지 않고도 객체에 새로운 임무를 부여하기 위해서 등장했다!

  • 객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴!
  • 상속(Inheritance)과 합성(Composition)을 사용하여 객체에 동적으로 책임을 추가할 수 있게 하는 패턴!
  • 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴!

[사용 목적]

  • 기존 객체들에게 영향을 주지 않고 개별 객체에 기능들을 추가하고 싶을때 사용!
  • 추가한 기능들은 언제든지 없앨 수 있다! => 없어져도 기존 객체들이 영향을 받지 않는다구!
  • 상속을 사용하여 기능을 확장하는 것이 힘들 경우에 사용!

[구조]

Component 

  • 동적으로 추가된 기능을 가질 수 있는 객체에 대한 인터페이스를 정의한다! (interface가 이상적, abstract class도 okay!)

Concrete Component

  • Component 인터페이스의 기능을 실제로 구현한 객체!
  • 새로운 기능들이 추가될 수 있는 객체!

Decorator

  • Component 인터페이스를 따르는 객체를 참조할 수 있는 필드가 존재
  • Component 인터페이스를 따르는 인터페이스를 정의

Concrete Decorator

  • 구성 요소에 기능을 추가!

Client

  • Component 인터페이스를 통해 모든 객체와 함께 동작할 수 있게 해주는... (걍 나는 main method라고.. 생각해요...)

https://refactoring.guru/design-patterns/decorator

[상황만들기]

1. <초반에 내가 구상한 개발 구조>

  • 처음에는 단순하게 간단한 음료만 만들려고했다. 

https://gdtbgl93.tistory.com/9

2. <중반에 생각해보니까 구현해야할 클래스들이... 너무많고 뭔가 엄청 복잡하자나~!!>

  • 근데 손님이 우유나 자바칩 같은거도 원해서.. 이것저것 추가하다보니 클래스들이 너무 많아졌다...!ㅠ

https://gdtbgl93.tistory.com/9

3. <데코레이터 패턴을 도입>

중간에 데코레이터를 두면서 깔끔하게 구조가 만들어졌따!

아니 이렇게만 보면 어렵자나! 코드를 내놔라!

https://gdtbgl93.tistory.com/9

[구현]

Component - 판매 하려고 하는 모~~든 음료수는 이 클래스를 상속 받아야해

// 음료의 공통적인 성질을 따로 뺀 것으로 카페에서 판매하는 모든 음료는 이 클래스를 상속 받아햐 한다.
public abstract class Beverage {
  protected String name;

  public String getName() {
    return name;
  }
  public abstract double costs();
}

Decorator - 데코용으로 쓰이는 모~~든 클래스들은 이 Decorator 클래스를 상속 받아야해

// Decorator의 역할을 하는 클래스
public abstract class BeverageDecorator extends Beverage{
  public abstract String getName();
}

Concrete Component

// Decorator 적용 X
public class Espresso extends Beverage {

  public Espresso() {
    // Beverage 로 부터 상속 받은 name
    name = "Espresso";
  }

  // Deco 없는 가격
  @Override
  public double costs() {
    return 2.5;
  }
}

Concrete Decorator

// Decorator 적용
public class Frappuccino extends Beverage {

  public Frappuccino() {
    // Beverage 로 부터 상속 받은 name
    name = "Frappuccino";
  }

  // Deco 없는 가격
  @Override
  public double costs() {
    return 3.0;
  }
}

Concrete Decorator - 데코용으로 쓰이는 내 최애 자바칩 데코 클래스!

// 나는 자바칩 데코가 짱좋아!
public class JavaChip extends BeverageDecorator{
  Beverage beverage;

  public JavaChip(Beverage beverage) {
    this.beverage = beverage;
  }

  @Override
  public double costs() {
    return 0.8 + beverage.costs();
  }

  @Override
  public String getName() {
    return beverage.getName() + " + Java Chip";
  }
}

Concrete Decorator - 데코용으로 쓰이는 우유 데코 클래스!

public class Milk extends BeverageDecorator {
  // 데코레이션 할 음료를 저장하기 위한 인스턴스 변수
  Beverage beverage;

  // 생성자를 통해 데코레이션 할 음료객체를 전달
  public Milk(Beverage beverage) {
    this.beverage = beverage;
  }

  @Override
  public double costs() {
    // 음료 가격에 우유요금 추가
    return 0.5 + beverage.costs();
  }

  // 어떤걸 데코했는지 설명란
  @Override
  public String getName() {
    return beverage.getName() + " + Milk";
  }
}

Client - 어서오세요 손님~

public class DecoratorPatternApplication {
  public static void main(String[] args) {

    // Deco 없이 에스프레소만 주문해보기!
    Beverage beverage = new Espresso();
    System.out.println(beverage.getName() + " $" + beverage.costs());

    // 우유랑 자바칩 추가
    Beverage beverage1 = new Frappuccino();
    beverage1 = new Milk(beverage1);
    beverage1 = new JavaChip(beverage1);

    System.out.println(beverage1.getName() + ", $" + beverage1.costs());
  }
}

결과물

[정리]

객체에 추가적인 것을 동적으로 첨가해준다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공!

 

단점

  • 구성요소를 초기화 하는 코드가 너~무 복잡해진다. (Client 부분)

 

아~ 아직 패턴 너무 많이 남았어 언제 자냐고~

오늘도 공부시켜주신 멘토분들 정말 감사드립니다!

 

https://icksw.tistory.com/244

 

[Swift 디자인 패턴] Decorator Pattern (데코레이터) - 디자인 패턴 공부 10

안녕하세요 Pingu입니다.🐧 지난 글에서는 구조 패턴 중 Composite Pattern(컴포지트)에 대해 알아봤는데요, 이번 글에서는 계속해서 구조 패턴 중 하나인 Decorator Pattern(데코레이터)에 대해 알아보도

icksw.tistory.com

https://velog.io/@jslog/Decorator-Pattern

 

[Design Pattern] Decorator Pattern이란?

데코레이터 패턴은 클래스의 코드를 전혀 바꾸지 않고도 객체에 새로운 임무를 부여하기 위해 등장하였습니다. 클래스의 코드를 바꾸지 않고 객체에 새로운 임무를 부여할 수 있게 설계한다면

velog.io

https://velog.io/@hanna2100/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-3.-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%98%88%EC%A0%9C-decorator-pattern

 

[디자인패턴] 3. 데코레이터 패턴 개념과 예제 (decorator pattern)

Head First Design Patterns 책을 보고 정리한 내용입니다. 디자인 패턴을 처음 입문하시는 분들께 추천드리고픈 책입니다. >[ 목차 ] 스트래티지 패턴 옵저버 패턴 데코레이터 패턴 팩토리 패턴 싱글턴

velog.io

https://gdtbgl93.tistory.com/9

 

[디자인패턴] 데코레이터 패턴 (Decorator Pattern)

데코레이터 패턴(Decorator pattern)이란 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 객체에 추가적인 요건을 동적으로 첨가하며, 기능 확장이 필요할 때 서브클래싱 대신

gdtbgl93.tistory.com

https://readystory.tistory.com/195

 

[구조 패턴] 데코레이터 패턴(Decorator Pattern) 이해 및 예제

데코레이터 패턴(Decorator Pattern)은 Flyweight 패턴, Adapter 패턴, Bridge 패턴처럼 구조 패턴 중 하나로, 런타임에서 객체의 기능을 수정하는데 사용되는 패턴입니다. 구조 패턴(Structural Pattern)이란? 구..

readystory.tistory.com

https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html

 

[Design Pattern] 데코레이터 패턴이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은

내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글