Contents
예시데코레이터는 객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서 위 행동들을 해당 객체들에 연결시키는 구조적 디자인 패턴
데코레이터 패턴(Decorator Pattern)은 객체의 행동을 동적으로 확장할 수 있는 구조적 디자인 패턴입니다. 이 패턴은 상속을 사용하지 않고도 기능을 추가할 수 있게 해주기 때문에, 더 유연하고 재사용 가능한 코드 작성이 가능합니다.
주요 특징:
- 확장성: 기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있습니다.
- 유연성: 여러 데코레이터를 조합하여 다양한 기능을 적용할 수 있습니다.
- 단일 책임 원칙(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("기본 알림");
}
}
구성 요소
- 컴포넌트 (Component)
- 인터페이스
Notifier
: 기본 기능을 정의하는 인터페이스입니다.Notifier
인터페이스는 데코레이터 패턴에서 공통의 인터페이스 역할을 합니다.
- 구체 컴포넌트 (Concrete Component)
- 클래스
BasicNotifier
:Notifier
인터페이스를 구현하는 기본 알림 기능을 제공하는 클래스입니다.BasicNotifier
클래스는 기본 알림 기능을 제공합니다.
- 데코레이터 (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메서드 실행으로 객체를 생성할 때 활용한 모든 클래스의 ‘출력 문구’를 콘솔 창에 띄울 수 있게 됩니다.

Share article