데코레이터 패턴

화낼거양's avatar
Nov 13, 2024
데코레이터 패턴
Contents
예시
 
 
💡
데코레이터는 객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서 위 행동들을 해당 객체들에 연결시키는 구조적 디자인 패턴
 
 
데코레이터 패턴(Decorator Pattern)은 객체의 행동을 동적으로 확장할 수 있는 구조적 디자인 패턴입니다. 이 패턴은 상속을 사용하지 않고도 기능을 추가할 수 있게 해주기 때문에, 더 유연하고 재사용 가능한 코드 작성이 가능합니다.
 

주요 특징:

  1. 확장성: 기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있습니다.
  1. 유연성: 여러 데코레이터를 조합하여 다양한 기능을 적용할 수 있습니다.
  1. 단일 책임 원칙(SRP): 객체에 여러 책임을 부여하지 않고도, 데코레이터를 통해 책임을 분리할 수 있습니다.
 
 
 

예시

 
package ch06.notification; public class BasicNotifier implements Notifier { Notifier notifier; public BasicNotifier(Notifier notifier) { this.notifier = notifier; } public BasicNotifier() {} public void send() { if (notifier != null) { notifier.send(); } System.out.println("기본 알림"); } }

구성 요소

  1. 컴포넌트 (Component)
      • 인터페이스 Notifier: 기본 기능을 정의하는 인터페이스입니다. Notifier 인터페이스는 데코레이터 패턴에서 공통의 인터페이스 역할을 합니다.
  1. 구체 컴포넌트 (Concrete Component)
      • 클래스 BasicNotifier: Notifier 인터페이스를 구현하는 기본 알림 기능을 제공하는 클래스입니다. BasicNotifier 클래스는 기본 알림 기능을 제공합니다.
  1. 데코레이터 (Decorator)
      • 클래스 BasicNotifier (부분적으로): 이 클래스는 컴포넌트를 확장하는 역할을 하며, 다른 Notifier 객체를 포함할 수 있습니다. 이로써 동적으로 알림 기능을 확장할 수 있습니다.
 
 

부가 설명 :

 
위와 같이 Notifier(send추상메소드를 가지고 있음) 를 implements 하는 클래스를 작성하고 이름을 BasicNotifier라고 지정했습니다.
이후 EmailNotiFier, SMSNotifier 클래스 또한 BasicNotifier클래스와 동일하게 작성하되,
public void send() { if (notifier != null) { notifier.send(); } System.out.println("기본 알림"); }
위의 send 메소드의 System.out.println() 출력 문구만 다르게 지정하였습니다.
 
 
결과적으로 예제에서 작성한 클래스들은 빈 생성자와
Notifier 인터페이스를 implements 하는 클래스를 받아 초기화하는 생성자. 2개를 가지고 있으며,
3개의 클래스들은 출력 문구를 제외하고 모두 동일한 패턴을 가지고 있기 때문에 아래와 같은 구조로 설계할 수도 있습니다.
 
 
메인메서드 :
// 1. 전체 알림 (기본알림 > 문자알림 > 이메일알림) Notifier n1 = new EmailNotifier(new SMSNotifier(new BasicNotifier())); n1.send();
 
위처럼 중첩적으로 Notifier를 implements하는 클래스들을 여러번 넣을 수 있으며,
n1 변수의 send메서드 실행으로 객체를 생성할 때 활용한 모든 클래스의 ‘출력 문구’를 콘솔 창에 띄울 수 있게 됩니다.
 
 
notion image
Share article

moohyun