Post

Decorator Pattern

Decorator Pattern 정리

Decorator Pattern

객체의 μΆ”κ°€μš”μ†Œλ₯Ό λ™μ μœΌλ‘œ 더할 수 μžˆλ‹€. μ„œλΈŒν΄λž˜μŠ€λ₯Ό λ§Œλ“œλŠ” 것보닀, 더 μœ μ—°ν•˜κ²Œ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ‹€.

즉, μ•„λž˜μ™€ 같은 ꡬ쑰λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€. 아메리카노 β†’ νœ˜ν•‘ μΆ”κ°€ β†’ μƒ· μΆ”κ°€ β†’ μƒ·μΆ”κ°€ β†’ 섀탕좔가 // 와 같이 계속 μ€‘μ²©μ μœΌλ‘œ κΈ°λŠ₯을 κ°€μ§ˆ 수 있게 ν•œλ‹€.

기쑴의 클래슀λ₯Ό ν™•μž₯ν•˜λŠ” 데, μ—¬κΈ°μ„œ 상속을 μ΄μš©ν•˜λ©΄ μ •μ μ΄λ―€λ‘œ λŸ°νƒ€μž„μ—μ„œ 객체의 행동을 λ³€κ²½ν•  수 μ—†κ³  ν•˜λ‚˜μ˜ λΆ€λͺ¨λ§Œ μ„ νƒν•΄μ•Όν•˜λŠ” μ œμ•½λ„ λ”°λ₯Έλ‹€. 이에 μ§‘ν•© 관계 ν˜Ήμ€ ν•©μ„± 관계λ₯Ό λ”°λ₯Έλ‹€. Decoratorμ—μ„œ Componentλ₯Ό κ΅¬μ„±ν•˜μ—¬, κΈ°λŠ₯을 μœ„μž„λ°›μ„ 수 μžˆλ‹€.

μ‹€μ œ μ½”λ“œ μ˜ˆμ‹œ

μ½”λ“œμ˜ˆμ‹œλŠ” GitHubμ—μ„œ κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€.

[Decorater 좔상 클래슀]

1
2
3
4
public abstract class CondimentDecorator extends Beverage {
	Beverage beverage;
	public abstract String getDescription();
}

[Component 좔상 클래슀]

1
2
3
4
5
6
7
8
9
public abstract class Beverage {
	String description = "Unknown Beverage";
  
	public String getDescription() {
		return description;
	}
 
	public abstract double cost();
}

[κΈ°λŠ₯ ν…ŒμŠ€νŠΈ]

  1. DarkRoast차에 λͺ¨μΉ΄μƒ·μ„ 2개 μΆ”κ°€ν•˜κ³ , νœ˜ν•‘ν¬λ¦Όμ„ μΆ”κ°€ν•œλ‹€.
  2. HouseBlend에 λ‘μœ μ™€ λͺ¨μΉ΄λ₯Ό μΆ”κ°€ν•˜κ³ , νœ˜ν•‘ν¬λ¦Όμ„ μΆ”κ°€ν•œλ‹€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String args[]) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() 
				+ " $" + beverage.cost());
 
		Beverage beverage2 = new DarkRoast();
		beverage2 = new Mocha(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription() 
				+ " $" + beverage2.cost());
 
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Soy(beverage3);
		beverage3 = new Mocha(beverage3);
		beverage3 = new Whip(beverage3);
		System.out.println(beverage3.getDescription() 
				+ " $" + beverage3.cost());
	}

μ‹€ν–‰κ²°κ³Ό μ•„λž˜μ™€ 같이 좜λ ₯λœλ‹€.

1
2
3
Espresso $1.99
Dark Roast Coffee, Mocha, Mocha, Whip $1.49
House Blend Coffee, Soy, Mocha, Whip $1.34

μœ„μ™€ 같이 μ§„ν–‰ν•˜λ©΄, 기쑴의 μ»΄ν¬λ„ŒνŠΈ(μ°¨)λ₯Ό λ°μ½”λ ˆμ΄ν„°λ‘œ κ°μ‹Έλ©΄μ„œ κΈ°λŠ₯을 λ°μ½”λ ˆμ΄ν„°μ—κ²Œ μœ„μž„ν•  수 μžˆλ‹€. 즉, 동적인 ν™•μž₯이 κ°€λŠ₯ν•˜λ‹€. λͺ‡κ°œλ“ , μ–Έμ œλ“  데코λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

단점

  • 객체λ₯Ό μ²˜μŒμ— μ΄ˆκΈ°ν™”ν•˜λŠ” 데, μ½”λ“œκ°€ 많이 ν•„μš”ν•˜λ‹€. μœ„μ—μ„œλ„ μ΄ˆκΈ°ν™”ν•˜λŠ”λ°, μ΄λ ‡κ²Œ λ§Žμ€ μ½”λ“œκ°€ ν•„μš”ν–ˆλ‹€.
1
2
3
4
		Beverage beverage2 = new DarkRoast();
		beverage2 = new Mocha(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
  • λ§Žμ€ ν΄λž˜μŠ€λ“€λ‘œ 인해, μ΄ν•΄ν•˜κΈ° λ³΅μž‘ν•  수 μžˆλ‹€.
  • νŠΉμ • ν˜•μ‹μ— μ˜μ‘΄ν•˜λŠ” μ½”λ“œμ— λ„μž…ν•˜λ©΄ 엉망이 λœλ‹€.(μ•„λž˜λŠ” GPT-4 μ˜ˆμ‹œ)

    예λ₯Ό λ“€μ–΄, Bird 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μš”κ΅¬ν•˜λŠ” ν•¨μˆ˜κ°€ 있고, FlyingBirdDecorator둜 Bird μΈμŠ€ν„΄μŠ€λ₯Ό λ°μ½”λ ˆμ΄νŠΈν•œ 경우, λ°μ½”λ ˆμ΄νŠΈλœ κ°μ²΄λŠ” 더 이상 Bird νƒ€μž…μ΄ μ•„λ‹ˆκ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ 이 ν•¨μˆ˜μ— λ°μ½”λ ˆμ΄νŠΈλœ 객체λ₯Ό μ „λ‹¬ν•˜λ €κ³  ν•˜λ©΄ νƒ€μž… 뢈일치 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

This post is licensed under CC BY 4.0 by the author.