데코레이터 패턴?
객체에 추가적인 기능을 동적으로 부여하여 기능을 확장하는 디자인 패턴입니다.
객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서
위 행동들을 해당 객체들에 연결시키는 구조적 디자인 패턴입니다.
기존 코드의 수정없이 새로운 기능을 조합하여 유연하게 추가할 수 있습니다.
장점과 단점
장점
- 유연한 기능 확장
- 조합 가능한 구조
- 단일 책임 원칙 준수
단점
- 객체 생성 복잡성 증가 (데코레이터가 많아질수록…)
- 디버깅 어려움 (여러 데코레이터가 중첩되어 있을 경우)
예시 코드
- 구성 요소
데코레이터와 실제 객체가 공유하는 인터페이스 / 객체에 추가될 기본 기능을 정의
public interface Notifier {
void send(); //알림 보내기
}
- 구체적인 구성 요소
기본 기능을 구현하는 실제 클래스들
// 기본알림
public class BasicNotifier implements Notifier {
Notifier notifier;
public BasicNotifier() {}
public BasicNotifier(Notifier notifier) {
this.notifier = notifier;
}
public void send(){
if(notifier != null){
notifier.send();
}
System.out.println("기본 알림");
}
}
//이메일 알림
public class EmailNotifier implements Notifier {
Notifier notifier;
public EmailNotifier(){}
public EmailNotifier(Notifier notifier) {
this.notifier = notifier;
}
public void send(){
if(notifier != null){
notifier.send();
}
System.out.println("이메일 알림");
}
}
//문자 알림
public class SmsNotifier implements Notifier{
Notifier notifier;
public SmsNotifier(){}
public SmsNotifier(Notifier notifier) {
this.notifier = notifier;
}
@Override
public void send() {
if(notifier != null){
notifier.send();
}
System.out.println("SMS 알림"); // 실제 구현해야할 핵심로직
}
}
- Main 코드
public class App {
public static void 알림(Notifier notifier) {
notifier.send();
}
// 데코레이션 패턴 : 기능 확장 (핵심)
public static void main(String[] args) {
//1. 전체 알림 (기본알림 -> 문자알림 -> 이메일알림)
Notifier n1 = new EmailNotifier(new SmsNotifier(new BasicNotifier()));
알림(n1);
System.out.println("===================");
//2. 전체 알림(기본알림 -> 이메일알림 -> 문자알림)
Notifier n2 = new SmsNotifier(new EmailNotifier(new BasicNotifier()));
알림(n2);
System.out.println("===================");
//3. 기본알림
Notifier n3 = new BasicNotifier();
알림(n3);
System.out.println("===================");
//4. 기본알림 + 문자 알림
Notifier n4 = new SmsNotifier(new BasicNotifier());
알림(n4);
System.out.println("===================");
//5. 기본알림 + 이메일알림
Notifier n5 = new EmailNotifier(new BasicNotifier());
알림(n5);
System.out.println("===================");
//6. 이메일 알림
Notifier n6 = new EmailNotifier();
알림(n6);
System.out.println("===================");
//7. 문자 알림
Notifier n7 = new SmsNotifier();
알림(n7);
System.out.println("===================");
//8. 문자 알림 + 이메일알림
Notifier n8 = new EmailNotifier(new SmsNotifier());
알림(n8);
System.out.println("==================");
}
}
Main 코드 결과
1
기본 알림
SMS 알림
이메일 알림
===================
2
기본 알림
이메일 알림
SMS 알림
===================
3
기본 알림
===================
4
기본 알림
SMS 알림
===================
5
기본 알림
이메일 알림
===================
6
이메일 알림
===================
7
SMS 알림
===================
8
SMS 알림
이메일 알림
==================
Share article