개발놀이터

데코레이터 패턴 본문

리팩토링/GOF 디자인패턴

데코레이터 패턴

마늘냄새폴폴 2022. 7. 7. 05:14

데코레이터 패턴은 무엇인가?

데코레이터 패턴은 주어진 상황및 용도에 따라 객체의 책임을 동적으로 추가할 수 있는 패턴을 말한다. 

 

데코레이터 패턴은 프록시를 이용해 부가기능을 추가해주는 역할을 하는 패턴이다. 트랜잭션시작을 쉽게 해주는 @Transactional과 같은 AOP들이 데코레이터 패턴을 이용해 만든 것들이다. 

 

데코페이터 패턴을 사용하면 기존 코드를 수정하지 않고도 행동을 확장시킬 수 있으며, 구성 및 위임을 통해 실행중인 행동을 추가할 수도 있다. 

 

클래스의 요소들을 계속해서 수정하면서 사용하는 구조인 경우나, 일부 요소들을 조합해서 사용하는 클래스 구조인 경우에 사용하면 좋다. 

 

데코레이터 패턴의 구조

 

 

데코레이터 패턴 예제

Component라는 인터페이스에서 런타임 의존관계를 계속해서 추가하는 방식으로 데코레이터 패턴을 구현할 수 있다. 

 

우리는 특정 문자열을 꾸미는 예제를 만들것이다. 기본적으로 RealComponent는 입력된 문자열을 단순 출력해주는 역할을 하고 MessageDecorator는 문자열을 꾸며주는 역할을 하게 될 것이다. 

 

데코레이터 패턴을 적용하기 전과 후로 예제를 분리하여 좀 더 보기 쉽게 작성될 것이다. 

 

1. Component 인터페이스 작성

public interface Component {
	String operation();
}

 

2. RealComponent 작성

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

 

3. 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);
    }
}

 

4. 데코레이터 패턴이 적용되기 전 테스트 코드 작성

@Slf4j
public class DecoratorPatternTest {
	
    @Test
    void noDecorator() {
    	Component realComponent = new RealComponent();
        DecoratorPatternClient client = new DecoratorPatternClient(realComponent);
        client.execute();
    }
}

 

5. 실행결과

 

6. MessageDecorator 추가

@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.infoi("MessageDecorator 꾸미기 적용 전 = {}, 적용 후 = {}, result, decoResult);
        
        return decoResult;
    }
}

 

7. 테스트 코드에 추가

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

 

8. 실행 결과

 

'리팩토링 > GOF 디자인패턴' 카테고리의 다른 글

프록시 패턴  (0) 2022.07.08
전략 패턴  (0) 2022.07.06
템플릿 메서드 패턴  (0) 2022.07.05