어제도 열심히 했고 오늘도 열심히 하기 위해서 너어어어어무 놀고싶고 쉬고싶지만
공부를 하기 위해서 컴퓨터에 앉았다 너무 기특해 림아 너모 기특해~
Decorator Pattern?
클래스의 코드를 전혀 바꾸지 않고도 객체에 새로운 임무를 부여하기 위해서 등장했다!
- 객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴!
- 상속(Inheritance)과 합성(Composition)을 사용하여 객체에 동적으로 책임을 추가할 수 있게 하는 패턴!
- 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴!
[사용 목적]
- 기존 객체들에게 영향을 주지 않고 개별 객체에 기능들을 추가하고 싶을때 사용!
- 추가한 기능들은 언제든지 없앨 수 있다! => 없어져도 기존 객체들이 영향을 받지 않는다구!
- 상속을 사용하여 기능을 확장하는 것이 힘들 경우에 사용!
[구조]
Component
- 동적으로 추가된 기능을 가질 수 있는 객체에 대한 인터페이스를 정의한다! (interface가 이상적, abstract class도 okay!)
Concrete Component
- Component 인터페이스의 기능을 실제로 구현한 객체!
- 새로운 기능들이 추가될 수 있는 객체!
Decorator
- Component 인터페이스를 따르는 객체를 참조할 수 있는 필드가 존재
- Component 인터페이스를 따르는 인터페이스를 정의
Concrete Decorator
- 구성 요소에 기능을 추가!
Client
- Component 인터페이스를 통해 모든 객체와 함께 동작할 수 있게 해주는... (걍 나는 main method라고.. 생각해요...)
[상황만들기]
1. <초반에 내가 구상한 개발 구조>
- 처음에는 단순하게 간단한 음료만 만들려고했다.
2. <중반에 생각해보니까 구현해야할 클래스들이... 너무많고 뭔가 엄청 복잡하자나~!!>
- 근데 손님이 우유나 자바칩 같은거도 원해서.. 이것저것 추가하다보니 클래스들이 너무 많아졌다...!ㅠ
3. <데코레이터 패턴을 도입>
중간에 데코레이터를 두면서 깔끔하게 구조가 만들어졌따!
아니 이렇게만 보면 어렵자나! 코드를 내놔라!
[구현]
Component - 판매 하려고 하는 모~~든 음료수는 이 클래스를 상속 받아야해
// 음료의 공통적인 성질을 따로 뺀 것으로 카페에서 판매하는 모든 음료는 이 클래스를 상속 받아햐 한다.
public abstract class Beverage {
protected String name;
public String getName() {
return name;
}
public abstract double costs();
}
Decorator - 데코용으로 쓰이는 모~~든 클래스들은 이 Decorator 클래스를 상속 받아야해
// Decorator의 역할을 하는 클래스
public abstract class BeverageDecorator extends Beverage{
public abstract String getName();
}
Concrete Component
// Decorator 적용 X
public class Espresso extends Beverage {
public Espresso() {
// Beverage 로 부터 상속 받은 name
name = "Espresso";
}
// Deco 없는 가격
@Override
public double costs() {
return 2.5;
}
}
Concrete Decorator
// Decorator 적용
public class Frappuccino extends Beverage {
public Frappuccino() {
// Beverage 로 부터 상속 받은 name
name = "Frappuccino";
}
// Deco 없는 가격
@Override
public double costs() {
return 3.0;
}
}
Concrete Decorator - 데코용으로 쓰이는 내 최애 자바칩 데코 클래스!
// 나는 자바칩 데코가 짱좋아!
public class JavaChip extends BeverageDecorator{
Beverage beverage;
public JavaChip(Beverage beverage) {
this.beverage = beverage;
}
@Override
public double costs() {
return 0.8 + beverage.costs();
}
@Override
public String getName() {
return beverage.getName() + " + Java Chip";
}
}
Concrete Decorator - 데코용으로 쓰이는 우유 데코 클래스!
public class Milk extends BeverageDecorator {
// 데코레이션 할 음료를 저장하기 위한 인스턴스 변수
Beverage beverage;
// 생성자를 통해 데코레이션 할 음료객체를 전달
public Milk(Beverage beverage) {
this.beverage = beverage;
}
@Override
public double costs() {
// 음료 가격에 우유요금 추가
return 0.5 + beverage.costs();
}
// 어떤걸 데코했는지 설명란
@Override
public String getName() {
return beverage.getName() + " + Milk";
}
}
Client - 어서오세요 손님~
public class DecoratorPatternApplication {
public static void main(String[] args) {
// Deco 없이 에스프레소만 주문해보기!
Beverage beverage = new Espresso();
System.out.println(beverage.getName() + " $" + beverage.costs());
// 우유랑 자바칩 추가
Beverage beverage1 = new Frappuccino();
beverage1 = new Milk(beverage1);
beverage1 = new JavaChip(beverage1);
System.out.println(beverage1.getName() + ", $" + beverage1.costs());
}
}
[정리]
객체에 추가적인 것을 동적으로 첨가해준다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공!
단점
- 구성요소를 초기화 하는 코드가 너~무 복잡해진다. (Client 부분)
아~ 아직 패턴 너무 많이 남았어 언제 자냐고~
오늘도 공부시켜주신 멘토분들 정말 감사드립니다!
[Swift 디자인 패턴] Decorator Pattern (데코레이터) - 디자인 패턴 공부 10
안녕하세요 Pingu입니다.🐧 지난 글에서는 구조 패턴 중 Composite Pattern(컴포지트)에 대해 알아봤는데요, 이번 글에서는 계속해서 구조 패턴 중 하나인 Decorator Pattern(데코레이터)에 대해 알아보도
icksw.tistory.com
https://velog.io/@jslog/Decorator-Pattern
[Design Pattern] Decorator Pattern이란?
데코레이터 패턴은 클래스의 코드를 전혀 바꾸지 않고도 객체에 새로운 임무를 부여하기 위해 등장하였습니다. 클래스의 코드를 바꾸지 않고 객체에 새로운 임무를 부여할 수 있게 설계한다면
velog.io
[디자인패턴] 3. 데코레이터 패턴 개념과 예제 (decorator pattern)
Head First Design Patterns 책을 보고 정리한 내용입니다. 디자인 패턴을 처음 입문하시는 분들께 추천드리고픈 책입니다. >[ 목차 ] 스트래티지 패턴 옵저버 패턴 데코레이터 패턴 팩토리 패턴 싱글턴
velog.io
https://gdtbgl93.tistory.com/9
[디자인패턴] 데코레이터 패턴 (Decorator Pattern)
데코레이터 패턴(Decorator pattern)이란 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 객체에 추가적인 요건을 동적으로 첨가하며, 기능 확장이 필요할 때 서브클래싱 대신
gdtbgl93.tistory.com
https://readystory.tistory.com/195
[구조 패턴] 데코레이터 패턴(Decorator Pattern) 이해 및 예제
데코레이터 패턴(Decorator Pattern)은 Flyweight 패턴, Adapter 패턴, Bridge 패턴처럼 구조 패턴 중 하나로, 런타임에서 객체의 기능을 수정하는데 사용되는 패턴입니다. 구조 패턴(Structural Pattern)이란? 구..
readystory.tistory.com
https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html
[Design Pattern] 데코레이터 패턴이란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은
내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
'public void static main > Etc' 카테고리의 다른 글
[Redis] Redis란? (0) | 2021.11.18 |
---|---|
[Design Pattern] Bridge Pattern (0) | 2021.11.16 |
[Design Pattern] Facade Pattern (0) | 2021.11.11 |
[Design Pattern] Adapter Pattern (0) | 2021.11.10 |
[Design Pattern] Builder Pattern (0) | 2021.11.09 |
댓글