[디자인 패턴] 장식자(Decorator) 패턴

 

❓장식자 패턴?

동적 기능을 추가하기 위해 구조를 개선하는 패턴입니다. 장식자 패턴은 어댑터 패턴과도 비슷한 개념입니다. 래퍼(Wrapper) 구조를 사용한다는 점에서 비슷한데요, 두 패턴의 목적성은 조금 다릅니다

  1. 어댑터 패턴 : 서로 다른 인터페이스의 통일
  2. 장식자 패턴 : 동적 기능을 추가함으로써 기능을 확장

이런 목적성을 가지는데요, 실제 프로그램에서는 딱 구분되는 것이 아니기 때문에 이렇구나 생각하고 넘어가겠습니다!

어댑터 패턴은 아래 글을 참고해주세요!

 

[디자인 패턴] 어댑터(Adapter) 패턴

❓어댑터 패턴? 어댑터 패턴은 구조 패턴으로, 다른 말로 래퍼(Wrapper) 패턴이라고도 합니다. 연관성 없는 2개의 객체를 묶어서 인터페이스를 만들어 주는 패턴을 말하는데요, 이를 통해 서로 연

lurgi.tistory.com

❗장식자 패턴의 예시 (JS)

우선 장식자 패턴의 예시를 만들어 보겠습니다.

class Drink {
    cost() {
        return 5;
    }

    description() {
        return "기본 음료";
    }
}

// 설탕 장식자 클래스
class Sugar {
    constructor(drink) {
        this.drink = drink;
    }

    cost() {
        return this.drink.cost() + 2;
    }

    description() {
        return this.drink.description() + ", 설탕 추가";
    }
}

const drink = new Drink();
console.log(drink.cost()) // 5
console.log(drink.description()) // 기본 음료

const drinkWithSugar = new Sugar(drink);
console.log(drinkWithSugar.cost()) // 7
console.log(drinkWithSugar.description()) // 기본 음료, 설탕 추가

아주 간단한 예시를 만들어 봤는데요, Sugar라는 장식자를 통해, drink의 동적 기능이 변경된 것을 확인할 수 있습니다! 이렇게 동적 기능을 확장할 수 있는 것을 ‘장식자 패턴’이라고 할 수 있겠네요!

❗장식자 패턴의 장점!

장식자 패턴은 상속을 이용한 오버라이딩 형식으로 객체를 확장하는 것이 아니라, 구성(Composition)을 통해 확장을 합니다. 따라서 상속의 강한 결합이 없기 때문에 유연한 확장이 가능 하죠. 여러 개의 장식자를 조합하는 것 역시 가능하게 됩니다.

따라서 클래스 간의 독립성을 유지할 수 있어 단일 책임 원칙을 준수할 수 있게 되는 것입니다!

❗결론!

장식자 패턴은 객체의 유연성을 유지하면서 동적 기능을 확장할 수 있는 패턴이라고 할 수 있겠습니다!