๋ฐ์ฝ๋ ์ดํฐ ํจํด์ด๋?
๋ฐ์ฝ๋ ์ดํฐ ํจํด์์๋ ๊ฐ์ฒด์ ์ถ๊ฐ์ ์ธ ๋ก์ง์ ๋์ ์ผ๋ก ์ถ๊ฐํ๋ค.
์๋ธํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ํตํด์ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ํ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
์นดํ์์ ์ฌ์ฉํ๋ ์ฃผ๋ฌธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ ํ์ฅ์ฑ ์๊ฒ ๊ตฌํํด๋ณด์.
์๊ตฌ์ฌํญ
- ํด๋น ์นดํ๋ ๊ธ์๋๋ก ์ฑ์ฅ์ ์ด์ด๊ฐ๊ณ ์๋ ์นดํ์ด๊ธฐ์ ๋ฉ๋ด์ ๋ณ๋์ด ๋ง๋ค.
- ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ ๋๋ ๋์ , ์คํ ์ฐ์ , ๋ชจ์นด, ํํ ํฌ๋ฆผ๊ณผ ๊ฐ์ ์ถ๊ฐ ๋ฉ๋ด๋ก ๊ตฌ์ฑํ๋ค.
- ๋ชจ๋ ๋ฉ๋ด๋ค์ cost()๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- ํ์ฌ ๊ธฐ์กด ์์คํ ์ ๊ตฌ์ฑ๋์ ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๊ธฐ์กด ์์คํ ์ ๋ฌธ์ ์
- ์์ ๊ตฌ์ฑ๋์๋ 4๊ฐ์ง ๋ฉ๋ด ๋ฐ์ ์์ด ๋จ์ํด๋ณด์ด์ง๋ง ๋ง์ฝ ์๋ง์ ์ฒจ๊ฐ๋ฌผ ๋ฉ๋ด, ์๋ง์ ๋ฉ๋ด๋ค์ ๋ํ๋ด๋ ค๋ฉด ๋ช์ญ, ๋ช๋ฐฑ๊ฐ์ง์ ํด๋์ค๊ฐ ํ์ํ ๊ฒ์ด๋ค.
- ์ฌ์ง์ด ํน์ ์ฒจ๊ฐ๋ฌผ ๋ฉ๋ด์ ๊ฐ๊ฒฉ์ด ์ค๋ฅด๋ฉด..? ๋ช์ญ, ๋ช๋ฐฑ๊ฐ์ง์ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ ์ผ์ด ๋ฐ์ํ ์๋ ์๋ค.
- ์ฒจ๊ฐ๋ฌผ ๋ฉ๋ด์ ์ข ๋ฅ๊ฐ ํ๋๋ง ์ฆ๊ฐํด๋ ํด๋์ค๋ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฐฉ์์ ์ด๋จ๊น?
- Beverage๊ฐ ๋ชจ๋ ์ฒจ๊ฐ๋ฌผ์ ์กด์ฌ ์ ๋ฌด๋ฅผ ํ์ธํ ์ ์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค.
- ๊ฐ ๋ฉ๋ด๋ฅผ ๋ํ๋ด๋ ํด๋์ค๋ Beverage๋ฅผ ์์๋ฐ์ ํ cost()๋ฅผ ๊ตฌํํ ๋ ์ํผ ํด๋์ค Beverage์ cost()๋ฅผ ํธ์ถํ์ฌ ๋น์ฉ์ ์ถ๊ฐํ๋ ์์ผ๋ก ๊ตฌํํ๋ค.
- ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ๋ฉด ๋จ์ํ ๋ฉ๋ด์ ๊ฐฏ์๋งํผ๋ง ํด๋์ค๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค. ๊ทธ๋ฐ๋ฐ...
- ๋ง์ฝ ์ฒจ๊ฐ๋ฌผ ๋ฉ๋ด์ ๊ฐ๊ฒฉ์ด ๋ณ๊ฒฝ๋๋ฉด..?, ์ฒจ๊ฐ๋ฌผ ์ข ๋ฅ๊ฐ ์ฆ๊ฐํ๋ฉด Beverage๋ฅผ ๊ณ์ ์์ ํด์ผํ๋ค.
- OCP ์์น์ ์งํค์ง ์๊ณ ์๋ค.
์ฐธ๊ณ ) OCP๋?
ํ์ฅ์๋ ์ด๋ ค์๊ณ ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค.
๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ด์ฉํ์ฌ OCP ์์น์ ์งํฌ ์ ์๋๋ก ์ค๊ณํด๋ณด์.
- ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ถ๊ฐ ๋ก์ง์ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์๋๋ก ํ๋ ํจํด์ด๋ค.
- ๋ฐ๋ผ์ ์์ ๊ฐ์ ์๊ตฌ์ฌํญ์์ ์์ฝ๊ฒ ์ฒจ๊ฐ๋ฌผ์ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ ์ ์๋ค.
- ์ ๋ฆฌํ์๋ฉด ์ถ๊ฐ๋๋ ๋ฉ๋ด๊ฐ ๊ธฐ์กด์ ๋ฉ๋ด๋ค์ ๊ฐ์ธ๋ ํ์์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ ํํ ์ดํด๊ฐ ๋์ง ์์๋ ๊ฐ๋ฐ์๋ค์ ์ฝ๋๋ฅผ ์ง์ ๋ณด๋๊ฒ ์ต๊ณ ๋ค.
ํ๋ฒ ์์ ์๊ตฌ์ฌํญ์ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ ์ฉํ์ฌ ์ ์ฐํ๊ฒ ๋ง๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ ์ฉํ ๊ตฌํ ๋ฐฉ์
public abstract class Beverage {
String description = "์ ๋ชฉ ์์";
public String getDescription() {
return description;
}
public abstract double cost();
}
// Beverage ํํ์ ๋ณ์์ ์ฝ์
๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ํ์ฉ
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
- ๊ฐ๊ฐ ๋ฉ๋ด์ ์ฒจ๊ฐ๋ฌผ๋ค์ด ์ง์ ๊ตฌํํด์ผ ํ๋ ์ถ์ ํด๋์ค์ด๋ค.
- ์์์ ์ด์ฉํ๋ ์ด์ ๋ ๋จ์ํ Beverage ๋ณ์์ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฃ๊ธฐ ์ํด ์์๋ฐ๋ ๊ฒ์ด๋ค.
/*
* HouseBlend ์ปคํผ ํด๋์ค
*/
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "ํ์ฐ์ค ๋ธ๋๋ ์ปคํผ";
}
public double cost() {
return 0.89;
}
}
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", ๋ชจ์นด";
}
/**
* Mocha๊ฐ ๊ฐ์ธ๊ณ ์๋ beverage์ ๊ฐ๊ฒฉ ๋ก์ง + ๋ณธ์ธ์ ์ธ๋ถ ๋ก์ง์ ํฉ์น๋ค.
*/
@Override
public double cost() {
return 0.20 + beverage.cost();
}
}
- ๊ฐ๊ฐ HouseBlend ๋ฉ๋ด ๊ตฌํ ํด๋์ค์ Mocha ์ฒจ๊ฐ๋ฌผ ๊ตฌํ ํด๋์ค์ด๋ค.
- Mocha๋ ๋ฐ์ฝ๋ ์ดํฐ ํด๋์ค๋ก์ ๋ก์ง์์ ํธ์ถํ Beverage ํํ์ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ํ์ ์คํ ์์ ์ Beverage ๋ณ์์ ํน์ ๊ฐ์ฒด๊ฐ ์ฝ์ ๋๊ฒ ๋๋ค.
public class DecoratorSimulation {
public static void main(String[] args) {
Beverage beverage = new HouseBlend();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage); // ํ์ฐ์ค ๋ธ๋๋ ์ปคํผ + ๋ชจ์นด + ๋ชจ์นด
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}
- ๋ฉ์ธ ๋ก์ง์ด๋ค.
- Mocha ์ฒจ๊ฐ๋ฌผ ๊ตฌํ ๊ฐ์ฒด๊ฐ HouseBlend ๋ฉ๋ด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๊ฐ์ผ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด์ด์ ์ถ๊ฐ๋ Mocha ์ฒจ๊ฐ๋ฌผ ๊ตฌํ ๊ฐ์ฒด๊ฐ Mocha๋ฅผ ๋ค์ ํ๋ฒ ๊ฐ์ผ๋ค.
- ์ด์ ํด๋น ์๋ฃ๋ Mocha 2๊ฐ๋ฅผ ํฌํจํ HouseBlend ์๋ฃ๊ฐ ๋์๋ค.
- ๋ง์ง๋ง์ berverage.cost()๋ฅผ ํธ์ถํจ์ผ๋ก์จ ํธ์ถ์ mocha -> mocha -> houseblend ์์ด์ง๋ง ์๋ฃ๋ houseblend -> mocha -> mocha ์์ผ๋ก ์๋ฃ๋๋ค.
- ์ ๋ฆฌํ์๋ฉด ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ธฐ๋ณธ ๋ก์ง์ ์ธ๋ถ ๋ก์ง์ ๋์ ์ผ๋ก ์์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ ํจํด์ด๋ผ๊ณ ํ ์ ์๋ค.
์ฌ์ฉ ์์ (์๋ฐ I/O)
- JAVA.IO ํจํค์ง์ ๋ง์ ๋ถ๋ถ์ด ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๋ฐํ์ผ๋ก ๋ง๋ค์ด์ก๋ค.
- ์๋ฅผ ๋ค์ด FileInputStream -> BufferedInputStream -> LineNumberInputStream์ด ์๋๋ฐ LineNumberInputStream์ ํ๋ฒํธ๋ฅผ ๋ถ์ฌ์ฃผ๋ ์ญํ ์, BufferedInputStream์ ๋ฒํผ ์ ์ถ๋ ฅ ๊ธฐ๋ฅ์ FileInputStream์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ผ ์ ์๋ ๊ธฐ๋ณธ ๊ตฌ์ฑ์์ ์ญํ ์ ํ๋ค.
- ์ฆ ๊ฐ๊ฐ์ ํด๋์ค๊ฐ ์ธ๋ถ๋ก์ง์ ํ๋์ฉ ๋ํด๊ฐ๋ฉฐ ํ๋์ ๋ก์ง์ ์์ฑ์ํค๊ณ ์๋ค.
Reference
Head First Design Patterns - (์๋ฆญ ํ๋ฆฌ๋จผ, ์๋ฆฌ์๋ฒ ์ค ํ๋ฆฌ๋จผ, ์ผ์ด์ ์์๋ผ, ๋นํธ ๋ฒ ์ด์ธ ) ์ ๋ณด๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.