티스토리 뷰
데코레이터 패턴
- 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴 (기능 확장)
구성
- Component
- ConcreteComponent와 Decorator가 구현할 인터페이스
- 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의
- 클라이언트는 Component를 통해 실제 객체를 사용함
public interface Display {
void draw();
}
- ConcreteComponent
- 기본 기능을 구현하는 클래스
public class RoadDisplay implements Display {
@Override
public void draw() {
System.out.println("Road Display"); // 기본 기능
}
}
- Decorator
- Decorator의 공통기능 제공
// 추가 기능에 대한 공통 쿨래스
public class DisplayDecorator implements Display {
private Display decoratedDisplay;
public DisplayDecorator(Display decoratedDisplay){
this.decoratedDisplay = decoratedDisplay;
}
@Override
public void draw() {
decoratedDisplay.draw(); // 기본 기능 실행
}
}
- ConcreteDecorator
- Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능
public class TrafficDecorator extends DisplayDecorator{
// 기본 기능 클래스 설정
public TrafficDecorator(Display decoratedDisplay) {
super(decoratedDisplay);
}
@Override
public void draw() {
super.draw(); // 공통 기능 수행, DispayDecorator의 draw 메소드 실행
drawTraffic(); // 이 데코레이터만의 개별 기능, 추가 기능 : Draw Traffic 출력
}
private void drawTraffic() {
System.out.println("Draw Traffic");
}
}
- Client
public class DecoratorMain {
public static void main(String[] args){
Display roadWithTraffic = new TrafficDecorator(new RoadDisplay());
roadWithTraffic.draw();
// 출력 결과
// Road Display
// Draw Traffic
}
}
프록시 패턴과 데코레이터 패턴의 차이
- 프록시 패턴에서는 프록시 객체와 실제 객체의 관계가 컴파일타임에 정해진다.
- 데코레이터 패턴에서는 Decorate와 Component의 관계가 런타임에 정해진다.
- 프록시 패턴은 요청을 위임해주는데 의의가 있고, 데코레이터 패턴은 부가기능을 추가하는데에 있다.
- 프록시 패턴에서 프록시는 기능에 대한 엑세스를 제어, 데코레이터는 기능을 추가한다.
- UserServiceTx에서 UserServiceImpl의 메서드를 호출 : 프록시 패턴
- new UserServiceTx(new UserService()) 트랜잭션 기능을 추가 : 데코레이터 패턴
Reference
https://diqmwl-programming.tistory.com/104
https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html
https://dailyheumsi.tistory.com/198
https://sabarada.tistory.com/60
https://eyevsky.tistory.com/entry/%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%94%84%EB%A1%9D%EC%8B%9C-%ED%8C%A8%ED%84%B4
'dev_note > TIL' 카테고리의 다른 글
SQL 레벨업 (0) | 2021.07.11 |
---|---|
웹 개발자를 위한 웹을 지탱하는 기술 (0) | 2021.07.11 |
프록시 (0) | 2021.07.10 |
(최근본상품2)Problem Solving (0) | 2019.02.23 |
(최근 본 상품1) 쿠키에 데이터 넣기 (0) | 2019.02.23 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- ASP.NET
- @Modifying
- jQuery
- 스프링MVC
- 다이내믹 프록시
- JavaScript
- Nullable
- JPA
- Spring
- OWIN
- JpaRepository
- Effective Java
- C# 문법
- uploadfive
- default interface
- MSSQL
- orphanRemoval
- c#
- 준영속
- 자바의 정석
- 스프링
- 영속성
- spring boot
- 빌더 패턴
- 고아 객체
- SpringBoot
- 토비의 스프링
- DataAnnotation
- Java
- 스프링 부트 테스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함