데코레이터 패턴

김인범's avatar
Nov 13, 2024
데코레이터 패턴
데코레이터 패턴?
객체에 추가적인 기능을 동적으로 부여하여 기능을 확장하는 디자인 패턴입니다.
객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서 위 행동들을 해당 객체들에 연결시키는 구조적 디자인 패턴입니다.
기존 코드의 수정없이 새로운 기능을 조합하여 유연하게 추가할 수 있습니다.
 

장점과 단점

장점

  1. 유연한 기능 확장
  1. 조합 가능한 구조
  1. 단일 책임 원칙 준수

단점

  1. 객체 생성 복잡성 증가 (데코레이터가 많아질수록…)
  1. 디버깅 어려움 (여러 데코레이터가 중첩되어 있을 경우)
 

예시 코드

  1. 구성 요소
데코레이터와 실제 객체가 공유하는 인터페이스 / 객체에 추가될 기본 기능을 정의
public interface Notifier { void send(); //알림 보내기 }
 
  1. 구체적인 구성 요소
기본 기능을 구현하는 실제 클래스들
// 기본알림 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 알림"); // 실제 구현해야할 핵심로직 } }
 
  1. 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

taker