inblog logo
|
moohyun
    디자인패턴

    데코레이터 패턴

    화낼거양'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
    Contents
    예시

    moohyun

    RSS·Powered by Inblog