Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- springdatajpa
- 스프링
- 자바
- 김영한
- db
- Greedy
- spring
- Thymeleaf
- 알고리즘
- JDBC
- jpa
- Servlet
- JPQL
- SpringBoot
- Proxy
- Spring Boot
- Android
- Exception
- kotlin
- 스프링 핵심 원리
- AOP
- 그리디
- 스프링 핵심 기능
- 인프런
- pointcut
- QueryDSL
- http
- java
- 백준
- transaction
Archives
- Today
- Total
개발자되기 프로젝트
Decorator 본문
1. Decorator Pattern
- 장식과 실제 내용물을 동일시
- 객체에 동적으로 책임을 추가
2. 의도 (Intent)와 동기(Motivation)
- 상속을 사용하지 않고 기능의 유연한 확장이 가능한 패턴
- 객체에 동적으로 새로운 서비스를 추가 할 수 있음
- 전체가 아닌 개별적인 객체에 새로운 기능을 추가 할 수 있음
3. Class Diagram
4. 객체 협력 (collaborations)
- Component : 동적으로 추가할 서비스를 가질 수 있는 객체 정의
- ConcreteComponent : 추가적인 서비스가 필요한 실제 객체
- Decorator : Component의 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 정의
- Decorator 는 Component를 참조하거나 또 다른 Decorator를 가지고 있어야 함.
- ConcreteDecorator : 새롭게 추가되는 서비스를 실제 구현한 클래스로 addBehavior()를 구현한다.
5. 중요한 결론 (consequence)
- 단순한 상속보다 설계의 융통성을 증대
- Decorator의 조합을 통해 새로운 서비스를 지속적으로 추가할 수 있음
- 필요없는 경우 Decorator를 삭제할 수 있음
- Decorator와 실제 컴포넌트는 동일한 것이 아님
- 작은 규모의 객체들이 많이 생성될 수 있음
- 자바의 I/O 스트림 클래스는 Decorator 패턴임
6. 예제
public abstract class Coffee {
public abstract void brewing();
}
public class KenyaCoffee extends Coffee{
@Override
public void brewing() {
System.out.println("Kenya Coffee");
}
}
- Decorator가 추상클래스?????? new 로 인스턴스를 생성할 필요가 없음. 막아버림.
public abstract class Decorator extends Coffee{
Coffee coffee;
public Decorator(Coffee coffee) {
this.coffee = coffee;
}
@Override
public void brewing() {
coffee.brewing();
}
}
- ConcreteDecorator는 Decorator의 메서드를 호출하고 부가 기능을 제공한다.
public class Mocha extends Decorator{
public Mocha(Coffee coffee) {
super(coffee);
}
@Override
public void brewing() {
super.brewing();
System.out.println("adding Mocha");
}
}
public class Latte extends Decorator{
public Latte(Coffee coffee) {
super(coffee);
}
@Override
public void brewing() {
super.brewing();
System.out.println("adding Milk");
}
}
public class CoffeeTest {
public static void main(String[] args) {
Coffee kenyaCoffee = new KenyaCoffee();
kenyaCoffee.brewing();
System.out.println("=================");
Latte kenyaLatte = new Latte(kenyaCoffee);
kenyaLatte.brewing();
System.out.println("=================");
Mocha kenyaMochaLatte = new Mocha(kenyaLatte);
kenyaMochaLatte.brewing();
System.out.println("=================");
}
}
Kenya Coffee
=================
Kenya Coffee
adding Milk
=================
Kenya Coffee
adding Milk
adding Mocha
=================
7. GitHub : 211109 Decorator Pattern
'Java > 디자인 패턴' 카테고리의 다른 글
Adapter Pattern (0) | 2021.11.09 |
---|---|
Composite Pattern (0) | 2021.11.09 |
기능의 선언과 구현을 분리 - Bridge (1) | 2021.11.08 |
기능의 선언과 구현을 분리 - Strategy Pattern (0) | 2021.11.08 |
하위 클래스 위임 - Factory Method (0) | 2021.11.07 |
Comments