JAVA

JAVA 디자인패턴 - 데코레이터(Decorator) 패턴

TECH 톡마스터 2023. 7. 13.

[ 목차 ]

    JAVA 디자인패턴 - 데코레이터(Decorator) 패턴
    JAVA 디자인패턴 - 데코레이터(Decorator) 패턴

    안녕하세요. 오늘은 JAVA 디자인패턴 중 데코레이터(Decorator) 패턴에 대해서 알아보겠습니다.

    1. 데코레이터(Decorator) 패턴 이란?

    데코레이터 패턴은 기존 객체에 동적으로 새로운 기능을 추가하거나 변경할 수 있는 구조적 디자인 패턴입니다. 이 패턴은 기존 클래스를 수정하지 않고 객체의 확장성을 개선하기 위해 사용되며, 객체 합성을 통해 런타임 중에 객체의 행동을 변경할 수 있습니다.

    ### 2. 데코레이터(Decorator) 패턴 구현 방법

    데코레이터 패턴을 구현하기 위한 주요 구성 요소는 다음과 같습니다:

    1. Component(기본 기능) 인터페이스: 객체의 기본 동작을 정의합니다.
    2. ConcreteComponent(구체적 기본 기능) 클래스: Component 인터페이스를 구현하는 기본 기능을 제공하는 실제 클래스입니다.
    3. Decorator 클래스: Component 인터페이스와 동일한 인터페이스를 가진 데코레이터 클래스로, ConcreteComponent 객체를 감싸며, 동일한 기능을 가지면서 추가적인 기능을 적용할 수 있는 클래스입니다.
    4. ConcreteDecorator 클래스: Decorator 클래스를 상속받아 동적 기능을 추가하거나 변경할 실제 구현 클래스입니다.
    // Component 인터페이스
    public interface Coffee {
        String getDescription();
        double cost();
    }
    
    // ConcreteComponent 클래스
    public class BasicCoffee implements Coffee {
        public String getDescription() {
            return "Basic Coffee";
        }
    
        public double cost() {
            return 1.00;
        }
    }
    
    // Decorator 클래스
    public abstract class CoffeeDecorator implements Coffee {
        protected Coffee decoratedCoffee;
    
        public CoffeeDecorator(Coffee decoratedCoffee) {
            this.decoratedCoffee = decoratedCoffee;
        }
    
        public String getDescription() {
            return decoratedCoffee.getDescription();
        }
    
        public double cost() {
            return decoratedCoffee.cost();
        }
    }
    
    // ConcreteDecorator 클래스
    public class MilkDecorator extends CoffeeDecorator {
        public MilkDecorator(Coffee decoratedCoffee) {
            super(decoratedCoffee);
        }
    
        public String getDescription() {
            return super.getDescription() + ", with Milk";
        }
    
        public double cost() {
            return super.cost() + 0.50;
        }
    }
    
    // 클라이언트 코드
    public class Main {
        public static void main(String[] args) {
            // 기본 커피 생성
            Coffee basicCoffee = new BasicCoffee();
            System.out.println(basicCoffee.getDescription() + ": $" + basicCoffee.cost());
    
            // 데코레이터를 사용해 커피에 우유 추가
            Coffee coffeeWithMilk = new MilkDecorator(basicCoffee);
            System.out.println(coffeeWithMilk.getDescription() + ": $" + coffeeWithMilk.cost());
        }
    }

    3. 데코레이터(Decorator) 패턴의 장단점

    3.1. 장점

    • 기존 코드를 수정하지 않고 동적으로 객체의 기능을 확장하거나 변경할 수 있습니다.
    • 클래스 상속보다 유연하게 객체를 조합하여 필요한 기능을 구성할 수 있습니다.
    • 객체의 책임을 확장하는데 수평적(structural) 접근이 가능합니다.

    3.2. 단점

    • 많은 데코레이터 객체를 관리해야 할 때 코드의 복잡도가 증가할 수 있습니다.
    • 데코레이터 체인이 길어질수록 디버깅과 유지보수가 어려워질 수 있습니다.

    4. 데코레이터(Decorator) 패턴의 활용 예

    데코레이터 패턴은 다양한 활용 사례가 있습니다. 

    • 윈도우 시스템에서의 GUI 구성요소: 버튼, 텍스트 박스 등의 기본 구성요소에 스크롤 바, 테두리, 그림자 등의 데코레이터를 동적으로 추가할 수 있습니다.
    • 요금제 시스템: 기본 요금제에 추가 옵션을 동적으로 추가해 결제 금액을 계산할 수 있습니다.
    • Java I/O API에서의 InputStream, OutputStream: 버퍼링, 암호화 등의 기능을 필요한 시점에 데코레이터를 통해 객체에 추가하여 사용할 수 있습니다.

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴

     

    디자인패턴 - 팩토리(Factory) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 싱글톤(Singleton) 패턴 [ 목차 ] 안녕하세요. 이번에는 팩토리(Factory) 패턴에 대해서 알아보도록 하겠습니다. 1. 팩토리(Factory) 패턴 이란? 팩토리 패턴은 객체 생성을

    tech.dj-tiger.com

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴

     

    디자인패턴 - 팩토리(Factory) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 싱글톤(Singleton) 패턴 [ 목차 ] 안녕하세요. 이번에는 팩토리(Factory) 패턴에 대해서 알아보도록 하겠습니다. 1. 팩토리(Factory) 패턴 이란? 팩토리 패턴은 객체 생성을

    tech.dj-tiger.com

    2023.07.12 - [JAVA] - 디자인패턴 - 어댑터(Adapter) 패턴

     

    디자인패턴 - 어댑터(Adapter) 패턴

    [ 목차 ] 안녕하세요. 오늘 알아볼 패턴은 어댑터(Adapter) 패턴입니다. 1. 어댑터(Adapter) 패턴 이란? 어댑터 패턴은 디자인 패턴 중 하나로, 서로 다른 인터페이스를 가진 클래스 또는 객체를 협력할

    tech.dj-tiger.com

     

    2023.07.12 - [JAVA] - JAVA 디자인패턴 - 싱글톤(Singleton) 패턴

     

    디자인패턴 - 싱글톤(Singleton) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴 [ 목차 ] 안녕하세요. 자바에는 다양한 디자인 패턴이 존재하고, 각 패턴은 특정한 문제를 해결하기 위해 설계되었습니다. 적절한 디자인 패턴

    tech.dj-tiger.com

    2023.07.13 - [JAVA] - JAVA 디자인패턴 - 옵저버(Observer) 패턴

     

    JAVA 디자인패턴 - 옵저버(Observer) 패턴

    [ 목차 ] 안녕하세요. 이번에는 Java 디자인패턴 중 옵저버(Observer) 패턴에 대해서 알아보겠습니다. 1. 옵저버(Observer) 패턴이란? 옵저버 패턴은 디자인 패턴 중 하나로, 한 객체의 상태가 변화하면

    tech.dj-tiger.com

     

     

    댓글

    💲 추천 글