원본에 장식을 더하는 패턴
프록시 패턴과 거의 동일하고 장식을 더한다 라는 관점에 초점이 맞춰져 있다.
알림 기능을 구현한다 해보자
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!");
}
}
위 코드는 언뜻 보면 문제가 없어 보인다.
하지만 서비스 측면의 기능에서 여러 유형의 알림을 한번에 사용하고 싶은 사용자가 있다면…?
알림을 조합한 클래스들을 사용하는 방법을 떠올릴 수 있다.

하지만 위 같은 방법은 알림이 하나라도 늘어나는 순간 수많은 클래스가 생성되야만 한다.
다른 방법으로는 알림을 컬렉션으로 가지고 있을수 있는 방법이다.
이 방법도 나빠보이지 않지만 컬렉션으로 Notifier를 가져야하는 클라이언트 코드에 수정이 가야 하니 조금 애매한 구석이 있다.
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() 만 해주면 된다.
참고문헌