데코레이터 패턴

이원찬·2024년 5월 30일

디자인 패턴

목록 보기
3/4

원본에 장식을 더하는 패턴

프록시 패턴과 거의 동일하고 장식을 더한다 라는 관점에 초점이 맞춰져 있다.

상황

알림 기능을 구현한다 해보자

SMS, Facebook, Slack 알림이 존재 할때

자연스럽게 Notifier 인터페이스를 사용하여 각 알림을 구현하는 방식으로 구현하면 좋을것 같다.

public interface Notifier {
    void send();
}

public class FaceBook implements Notifier{
    @Override
    public void send() {
        System.out.println("FaceBook Message!");
    }
}

public class Slack implements Notifier{
    @Override
    public void send() {
        System.out.println("Slack Message!");
    }
}

public class SMS implements Notifier{
    @Override
    public void send() {
        System.out.println("SMS message!");

    }
}

위 코드는 언뜻 보면 문제가 없어 보인다.

하지만 서비스 측면의 기능에서 여러 유형의 알림을 한번에 사용하고 싶은 사용자가 있다면…?

방법1

알림을 조합한 클래스들을 사용하는 방법을 떠올릴 수 있다.

하지만 위 같은 방법은 알림이 하나라도 늘어나는 순간 수많은 클래스가 생성되야만 한다.

방법2

다른 방법으로는 알림을 컬렉션으로 가지고 있을수 있는 방법이다.

이 방법도 나빠보이지 않지만 컬렉션으로 Notifier를 가져야하는 클라이언트 코드에 수정이 가야 하니 조금 애매한 구석이 있다.

방법 3 데코레이터 패턴

Notifier를 확장하는 NotifierDecorator 들을 만들어두는 방법이 있다.

public class NotifierDecorator implements Notifier {
    private Notifier baseNotifier;

    public NotifierDecorator(Notifier baseNotifier) {
        this.baseNotifier = baseNotifier;
    }

    @Override
    public void send() {
        baseNotifier.send();
    }
}

public class FacebookDecorator extends NotifierDecorator {
    public FacebookDecorator(Notifier baseNotifier) {
        super(baseNotifier);
    }

    @Override
    public void send() {
        super.send();
        FaceBook faceBook = new FaceBook();
        faceBook.send();
    }
}

public class SMSDecorator extends NotifierDecorator{
    public SMSDecorator(Notifier baseNotifier) {
        super(baseNotifier);
    }

    @Override
    public void send() {
        super.send();
        SMS sms = new SMS();
        sms.send();
    }
}

SlackDecorator 는 생략...

Notifier stack = new FaceBook();
stack = new SMSDecorator(stack);
stack = new SlackDecorator(stack);
stack.send();

위같은 경우 클라이언트는 Stack 처럼 쌓인 Notifier를 받고 send() 만 해주면 된다.

참고문헌

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

profile
소통과 기록이 무기(Weapon)인 개발자

0개의 댓글