Spring 핵심원리 고급편 - Decorator Pattern 1

목차

Decorator 패턴

Decorator 패턴 은 기존 객체 수정없이 부가 기능 추가 를 위해 주로 사용하는 디자인 패턴이다.

Decorator 패턴은 객체 지향 디자인 원칙 중 하나인 개방-폐쇄 원칙(OCP) 을 따릅니다. 이 패턴을 사용하면 코드의 수정 없이 기존 클래스에 새로운 기능을 추가하거나 기존 기능을 수정할 수 있습니다.

Decorator 클래스는 기본 객체와 같은 인터페이스를 사용해 구현되며, 기본 객체를 Wrapping 하여 추가적인 기능을 제공합니다. 이러한 구조는 객체 간의 결합도를 낮추고, 유연성과 확장성을 높입니다.

기존 객체를 감싸는 Wrapper 클래스 를 만들고, Wrapper 클래스에 새로운 기능을 추가하는 방식으로 새로운 기능을 추가하거나 기존 기능을 수정하는데 사용됩니다. Decorator 패턴을 사용하면 객체의 기존 동작을 변경하지 않고도 객체에 새로운 동작을 추가할 수 있습니다.

Decorator 패턴의 구성요소

  • Component
    • 인터페이스나 추상 클래스로 정의된 기본 객체의 공통 인터페이스입니다.
  • ConcreteComponent
    • Component 인터페이스를 구현한 실제 객체입니다.
  • Decorator
    • Component 인터페이스를 구현하며, 기본 객체를 래핑하고 추가적인 기능을 제공하는 추상 클래스입니다.
  • ConcreteDecorator
    • Decorator 추상 클래스를 상속받아 기본 객체를 래핑하고 추가적인 기능을 구현한 실제 객체입니다.

인터페이스

public interface Component {
String operation();
}

대상 객체

@Slf4j
public class RealComponent implements Component{
@Override
public String operation() {
log.info("Real Component 실행");
return "data";
}
}

Client 코드

@Slf4j
public class DecoratorPatternClient {

private Component component;

public DecoratorPatternClient(Component component){
this.component = component;
}

public void execute(){
String result = component.operation();
log.info("result = {}", result);
}
}

실행 및 결과

@Slf4j
public class DecoratorPatternTest {

@Test
void noDecorator(){
Component component = new RealComponent();
DecoratorPatternClient client = new DecoratorPatternClient(component);
client.execute();
}
}

데코레이터 패턴 적용

  • MessageDecorator 는 Component 인터페이스를 구현해 생성하고 내부적으로 대상 Component 객체를 관리한다.
  • MessageDecorator 에서 구현된 Method 는 부가기능을 수행하는 로직을 수행하고 대상 Component 객체를 호출한다.
@Slf4j
public class MessageDecorator implements Component{

private Component component;

// 생성자를 통한 의존성 주입
public MessageDecorator(Component component) {
this.component = component;
}

@Override
public String operation() {
log.info("MessageDecorator 실행");

// 대상 객체를 호출한다.
String result = component.operation();
String decoResult = "*****" + result + "*****" ;

log.info("MessageDecorator 꾸미기 적용 전 = {}, 적용 후 = {}", result, decoResult);
return decoResult;
}
}

실행 및 결과

실제 객체 RealComponent 를 이용해 부가기능이 적용된 MessageDecorator 객체를 생성해준다.

@Test
void decorator1(){
Component realComponent = new RealComponent();
Component messageDecorator = new MessageDecorator(realComponent);
DecoratorPatternClient client = new DecoratorPatternClient(messageDecorator);
client.execute();
}

실행 결과를 통해 MessageDecorator 가 호출돼 부가기능 로직이 수행되고 실제 객체 RealComponent 가 호출된 것을 확인할 수 있다.

데코레이터 패턴 클래스 의존 관계

여러개의 데코레이터 추가

Share