728x90
Overview
데코레이터 패턴은 음료에 시럽을 첨가하는 것과 같습니다.
한 음료에 시럽을 첨가하여 다른 음료를 만들 수 있습니다.
장점
1. 기존 코드를 수정하지 않고 데코레이터 패턴을 통해 행동을 확장할 수 있습니다.
2. 구성 및 위임을 통해 실행하면서 새 작업을 추가할 수 있습니다.
불리
1. 무의미한 대상을 너무 많이 추가할 수 있습니다.
2. 데코레이터가 너무 많으면 코드가 필요 이상으로 복잡해질 수 있습니다.
다음과 같은 상황에서 데코레이터 패턴을 사용하는 것이 좋습니다.
1. 클래스의 요소를 계속 수정하면서 사용할 구조체가 필요한 경우
2. 다양한 요소를 조합하여 사용하는 클래스 구조인 경우
Structure
Code Example
package com.example.design.pattern;
abstract class Beverage {
protected String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
class Espresso extends Beverage {
public Espresso() {
this.description = "Espresso";
}
@Override
public double cost() {
return 1;
}
}
class HouseBlend extends Beverage {
public HouseBlend() {
this.description = "House Blend";
}
@Override
public double cost() {
return 1.5;
}
}
abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
class Mocha extends CondimentDecorator {
private final Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public double cost() {
return 0.20 + beverage.cost();
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
}
class Whip extends CondimentDecorator {
private final Beverage beverage;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
@Override
public double cost() {
return 0.15 + beverage.cost();
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Whip";
}
}
public class MyDecorator {
public static void main(String[] args) {
Beverage b = new Mocha(new Mocha(new Whip(new HouseBlend())));
System.out.println(b.getDescription());
System.out.println(b.cost());
}
}
Console Result
House Blend, Whip, Mocha, Mocha
2.05
Additional Code Example
You can use Decorator Pattern to create arithmetic calculators.
package com.example.test;
abstract class Base {
protected float result = 0;
public float calc() {
return result;
}
}
class Number extends Base {
public Number(float n) {
this.result = n;
}
}
abstract class CondimentDecorator extends Base {
public abstract float calc();
}
class Plus extends CondimentDecorator {
final Base base1;
final Base base2;
public Plus(Base base1, Base base2) {
this.base1 = base1;
this.base2 = base2;
}
@Override
public float calc() {
return base1.calc() + base2.calc();
}
}
class Minus extends Plus {
public Minus(Base base1, Base base2) {
super(base1, base2);
}
@Override
public float calc() {
return base1.calc() - base2.calc();
}
}
class Multipl extends Plus {
public Multipl(Base base1, Base base2) {
super(base1, base2);
}
@Override
public float calc() {
return base1.calc() * base2.calc();
}
}
class Division extends Plus {
public Division(Base base1, Base base2) {
super(base1, base2);
}
@Override
public float calc() {
return base1.calc() / base2.calc();
}
}
public class MyDecorator {
public static void main(String[] args) {
Base a = new Number(3);
System.out.println(a.calc());
Base b = new Plus(new Number(2), new Number(5));
System.out.println(b.calc());
// ( ( 4 + 2 ) * ( 8 - 1 ) ) / 2
Base c = new Division(new Multipl(new Plus(new Number(4), new Number(2)), new Minus(new Number(8), new Number(1))), new Number(2));
System.out.println(c.calc());
}
}
Console Result
3.0
7.0
21.0
Conclusion
N/A
728x90
'Java Design Pattern' 카테고리의 다른 글
[ENG][디자인패턴]Singleton 패턴 이론과 설명 (0) | 2022.06.01 |
---|---|
[ENG][디자인패턴]Observer 패턴 이론과 설명 (0) | 2022.05.31 |
[ENG][디자인패턴]MVC 패턴 이론과 설명 (0) | 2022.05.30 |
[ENG][디자인패턴]Mediator 패턴 이론과 설명 (0) | 2022.05.27 |
[ENG][디자인패턴]Iterator 패턴 이론과 설명 (0) | 2022.05.26 |
[ENG][디자인패턴]Factory Method 패턴 이론과 설명 (0) | 2022.05.26 |
[ENG][디자인패턴]Builder 패턴 이론과 설명 (0) | 2022.05.24 |
[ENG][디자인패턴]Bridge 패턴 이론과 설명 (0) | 2022.05.24 |