Search

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด (Decorator Pattern)

๊ธฐ์กด ๊ฐ์ฒด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๋™์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ƒ์† ๋Œ€์‹  ํ•ฉ์„ฑ(Composition)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋Ÿฐํƒ€์ž„์— ๊ธฐ๋Šฅ์„ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ชฉ์ 

โ€ข
๊ฐ์ฒด์— ๋™์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์ฑ…์ž„(๊ธฐ๋Šฅ)์„ ์ถ”๊ฐ€
โ€ข
์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ์˜ ๋‹จ์ ์„ ๋ณด์™„
โ€ข
๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ง€ํ‚ค๋ฉด์„œ ๊ธฐ๋Šฅ ํ™•์žฅ ๊ฐ€๋Šฅ

ํŠน์ง•

โ€ข
๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ ํ™•์žฅ ๊ฐ€๋Šฅ (๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)
โ€ข
๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์™€ ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
โ€ข
์—ฌ๋Ÿฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
โ€ข
์‹คํ–‰ ์ค‘์— ๋™์ ์œผ๋กœ ๊ธฐ๋Šฅ ์ถ”๊ฐ€/์ œ๊ฑฐ ๊ฐ€๋Šฅ

์˜ˆ์‹œ ์ฝ”๋“œ

// Component ์ธํ„ฐํŽ˜์ด์Šค interface Coffee { double getCost(); String getDescription(); } // ConcreteComponent class SimpleCoffee implements Coffee { public double getCost() { return 1.0; } public String getDescription() { return "Simple Coffee"; } } // Decorator abstract class CoffeeDecorator implements Coffee { protected Coffee decoratedCoffee; public CoffeeDecorator(Coffee coffee) { this.decoratedCoffee = coffee; } public double getCost() { return decoratedCoffee.getCost(); } public String getDescription() { return decoratedCoffee.getDescription(); } } // ConcreteDecorator class Milk extends CoffeeDecorator { public Milk(Coffee coffee) { super(coffee); } public double getCost() { return super.getCost() + 0.5; } public String getDescription() { return super.getDescription() + ", Milk"; } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ ์„ค๋ช…

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ์ปคํ”ผ ์ฃผ๋ฌธ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด:
โ€ข
Coffee ์ธํ„ฐํŽ˜์ด์Šค (Component): ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๊ฐ€๊ฒฉ(getCost)๊ณผ ์„ค๋ช…(getDescription)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
โ€ข
SimpleCoffee ํด๋ž˜์Šค (ConcreteComponent): Coffee ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ธฐ๋ณธ ์ปคํ”ผ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ฐ€๊ฒฉ๊ณผ ์„ค๋ช…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
โ€ข
CoffeeDecorator ํด๋ž˜์Šค (Decorator): ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ํ‹€์„ ์ œ๊ณตํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. Coffee ๊ฐ์ฒด๋ฅผ ํฌํ•จ(composition)ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
Milk ํด๋ž˜์Šค (ConcreteDecorator): ์‹ค์ œ ์žฅ์‹์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋กœ, ์ปคํ”ผ์— ์šฐ์œ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ปคํ”ผ์˜ ๊ฐ€๊ฒฉ๊ณผ ์„ค๋ช…์— ์šฐ์œ  ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปคํ”ผ์— ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
Coffee coffee = new SimpleCoffee(); coffee = new Milk(coffee); // ์šฐ์œ  ์ถ”๊ฐ€ // ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(์„คํƒ•, ์‹œ๋Ÿฝ ๋“ฑ)๋ฅผ ๋” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
Java
๋ณต์‚ฌ