장점 :
새로운 클래스를 생성하지 않고 기존의 기능을 그대로 조합이 가능하다 (단일책임 원칙,ocp,di 역전 원칙등...)
런타임에 동적으로 기능들을 조합하거나 변경할수있다.
클라이언트는 Component를 사용해서 실제 객체를 사용하게 된다.
출처 : https://mrnamu.blogspot.com/2019/10/3-decorator-pattern.html
예시
Component : 기본 기능을 정의하는 클래스인 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의한 클래스(인터페이스)
즉, 클라이언트는 Component의 정의된 기능을 통해 조작하게된다.
ConcreteComponent : 기본 기능을 구현하는 클래스
Decorator : 여러 구체적인 Decorator 의 공통기능을 정의 해둔 클래스
public interface CommentService {
void addComment(String comment);
}
public class DefaultCommentService implements CommentService {
@Override
public void addComment(String comment) {
System.out.println(comment);
}
}
public class CommentDecorator implements CommentService {
private CommentService commentService; //Wrappee
public CommentDecorator(CommentService commentService) {
this.commentService = commentService;
}
@Override
public void addComment(String comment) {
commentService.addComment(comment);
}
}
public class TrimmingCommentDecorator extends CommentDecorator {
public TrimmingCommentDecorator(CommentService commentService) {
super(commentService);
}
@Override
public void addComment(String comment) {
super.addComment(trim(comment));
}
private String trim(String comment) {
return comment.replace("...", "");
}
}
public class inSpring {
public static void main(String[] args) {
// 웹플럭스 http 요청 데코레이터터
ServerHttpRequestDecorator request;
// 응답 데코레이터터
ServerHttpResponseDecorator response;
}
}
출처 : 백기선님의 디자인패턴