์ฑ
'ํค๋ ํผ์คํธ. Eric Freeman๊ณผ Elizabeth Robson์ "๋์์ธ ํจํด"์ ์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ฐ์ฒด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ์ ๊ณตํ๋ฉฐ ๊ธฐ๋ฅ ํ์ฅ์ ์ํ ํ์ ํด๋์คํ์ ๋์์
๋๋ค. ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ ์๋ฅผ ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋น์ ์ด ๋ ๋ค๋ฅธ ํ๋ ์ข
๊ต๋ฅผ ์ฐฝ์คํ๊ณ ์ฌ๋๋ค์๊ฒ ๊ทธ์ ์์ํ๋ ์๋น์ค๋ฅผ ์ ๊ณตํ ๊ณํ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์ญ์์ค. ์๋ํ๋ฉด ํ๋์ ๊ฒฝํฅ์ ์ฑ์์ฃผ์, ์ํํ, ์ธ๊ฐ ๋ฐ์ ์ ์ถ๊ตฌํ๋ฉฐ ์ด๋ค ์ด์ ์์์ธ์ง ์ฌ๋๋ค์ "์ ํต์ ์ธ" ์ข
๊ต(๊ฒฐ๊ตญ ๋ฌด์ ๋ก )์ ๋ง์กฑํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋น์ ์ ์ฃผ๋ฅ๋ฅผ ๋ฐ๋ผ ๋ ๋ค๋ฅธ ๋ด์์ด์ง ์ข
๊ต(๊ธฐ์กด ์ข
๊ต๋ก๋ถํฐ์ ์ผ์ข
์ ์ข
ํฉ)๋ฅผ ์ฐฝ์กฐํฉ๋๋ค. ์ข
๊ต, ๊ฐ๊ฐ์์ ์ข์ํ๋ ๊ฒ์ ์ทจํจ). ์ฒ์์๋ ๋ค์๊ณผ ๊ฐ์ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค: 1. ์ด์ธ 2. ์ด์ธ ์ฆ. ๋ชจ๋ ๊ฒ์ด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ฌผ๋ก ๊ฐ๊ฒฉ๊ณผ ์ค๋ช
์ด ํฌํจ๋ ์๋น์ค ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค.
public interface Service {
public double getPrice();
public String getLabel();
}
๋ฐ ์๋น์ค
public class Divination implements Service {
private String label;
private double price;
public Divination(String label, double price) {
this.label = label;
this.price = price;
}
public double getPrice() {
return this.price;
}
public String getLabel() {
return this.label;
}
}
public class Horoscope implements Service {
private String label;
private double price;
public Horoscope(String label, double price) {
this.label = label;
this.price = price;
}
public double getPrice() {
return this.price;
}
public String getLabel() {
return this.label;
}
}
๋ฐ๋ผ์ 2๊ฐ์ง ์ฃผ๋ฌธ์ด ๋ํ๋ฌ์ต๋๋ค(ํ๋ก ์นด๋๋ฅผ ์ฌ์ฉํ ์ด์ธ ๋ฐ ๊ณ ๊ฐ์ ๊ฐ์ธ ๋ณ์๋ฆฌ ์ด์ธ).
public static void main(String[] args) {
double cost;
// ะะฐะดะฐะฝะธะต ะฝะฐ ะขะฐัะพ
Service taro = new Divination("ะขะฐัะพ", 1000);
// ะ ะฟะตััะพะฝะฐะปัะฝัะน ะณะพัะพัะบะพะฟ
Service personalHoroscope = new Horoscope("ะะตััะพะฝะฐะปัะฝัะน ะณะพัะพัะบะพะฟ", 9000);
cost = taro.getPrice() + personalHoroscope.getPrice();
System.out.println(cost);
}
๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋จ์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
10000.0
๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฏธ ์์ฒ ๋ช
์ ์๋๋๋ผ๋ ์๋ฐฑ ๋ช
์ด ์ฌ๋ฌ๋ถ๊ณผ ๊ฐ์ ์ฌ๋๋ค์ด ์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ ์์ฑ์ ๊ณ์ ๋ฐ์ ์์ผ์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ค์ ๋ ์ด์ ๊ด์ฌ์ ๊ฐ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด ์๋น์ค์ ์ถ๊ฐ ์ต์
์ ์ต์
์ผ๋ก ์ ๊ณตํ๊ฒ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด์ธ ์๋น์ค(ํ๋ก ๋๋ ์ปคํผ ์ฐ๊บผ๊ธฐ)๋ฅผ ์ ํํ ๋ ์ถ๊ฐ ์ต์
์ผ๋ก ์ฐจํฌ๋ผ ๋๋ ์ค๋ผ์ ํน์ฑ์ ์ฃผ๋ฌธํ ์ ์์ต๋๋ค(๊ฐ๊ฐ ๋น์ฉ์ ์์ฒด์ ์). ๋ชจ๋ ๊ฒ์ด ์ด๋ฏธ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋๊ณ ๊ณ์ฐ๋ ๊ธฐ์กด ์๋น์ค ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ก ์ด๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์ต๋๊น? ํ์ฌ Divination์ Divination + Chakras ๋๋ Divination + Aura ํด๋์ค๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
public class Divination implements Service {
// ะะดะตัั ัะฒะพั ััะพะธะผะพััั ะธ ะดััะณะธะต ะผะตัะพะดั
}
public class DivinationWithChakras implements Service {
// ะะดะตัั ัะฒะพั ััะพะธะผะพััั ะธ ะดััะณะธะต ะผะตัะพะดั
}
public class DivinationWithAura implements Service {
// ะะดะตัั ัะฒะพั ััะพะธะผะพััั ะธ ะดััะณะธะต ะผะตัะพะดั
}
์๋๋ฉด ๊ทธ๋ฅ ์๋ธํด๋์ฑ์ ์ฌ์ฉํ์ธ์. ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ ํด๋์ค๋ก ํ์ฅ
public class DivinationWithAura extends Divination {
public DivinationWithAura(String label, double price) {
super(label, price);
}
// ะะดะตัั ัะฒะพั ััะพะธะผะพััั ะธ ะดััะณะธะต ะผะตัะพะดั
}
public class DivinationWithChakras extends Divination {
public DivinationWithChakras(String label, double price) {
super(label, price);
}
// ะะดะตัั ัะฒะพั ััะพะธะผะพััั ะธ ะดััะณะธะต ะผะตัะพะดั
}
๊ทธ๋ฌ๋ ๋จ์ ์ ์ฆ์ ๋์ ๋๊ณ ์ ์ธ๊ณ์ ์์ฑ์ ๋ฐ์ ์ํค๊ณ ์๋ก์ด ์ถ๊ฐ ์ต์
์ ๊ฐ๊ฒ ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ก์ด ํด๋์ค๋ฅผ ์๋ฏธํ๋ฉฐ ์ฌ์ ํ ํ์ฌ ํด๋์ค๋ฅผ ๊ฒฐํฉํด์ผํ๋ค๋ฉด ํด๋์ค๋ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ๊ฒ์
๋๋ค. ๋ ๊ฐ์ง ์ต์
์ ํจ๊ป ์ฌ์ฉํ๊ณ ๋ณ๋๋ก ๋ณ๋๋ก ์ฌ์ฉํ์ง ์๋ ์ด์ธ ์์
์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
public class DivinationWithChakrasAndAura implements Service {
// ะะดะตัั ัะฒะพั ััะพะธะผะพััั ะธ ะดััะณะธะต ะผะตัะพะดั
}
์ฌ๊ธฐ๊ฐ Java์์ ๋งค์ฐ "์ ์ฝ์ ์ธ" ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ฌ์ฉํ ์ ์๋ ๊ณณ์
๋๋ค. ์ด๋ฅผ ์ํด ์๋น์ค๋ฅผ ๊ตฌํํ๊ณ ์๋น์ค๋ ํฌํจํ๋ ์ถ๊ฐ ์ต์
์ ๋ํ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ธ๋ฅผ ์ฃผ๋ฌธํด์ผํ๊ณ ๋ ๊ฐ์ง ์ต์
์ ํจ๊ป ์ฌ์ฉํด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์
๋๋ค. ์ธํฐํ์ด์ค๋ ์ฒ์๋ถํฐ ๊ทธ๋ฌ์ต๋๋ค.
public interface Service {
public double getPrice();
public String getLabel();
}
2๊ฐ์ง ์๋น์ค ๋ฑ๊ธ, ์ด์ ๊ณผ ๋์ผ:
public class Divination implements Service {
private String label;
private double price;
public Divination(String label, double price) {
this.label = label;
this.price = price;
}
public double getPrice() {
return this.price;
}
public String getLabel() {
return this.label;
}
}
public class Horoscope implements Service {
private String label;
private double price;
public Horoscope(String label, double price) {
this.label = label;
this.price = price;
}
public double getPrice() {
return this.price;
}
public String getLabel() {
return this.label;
}
}
์ถ๊ฐ ์ต์
์ ์ํ ๋ฐ์ฝ๋ ์ดํฐ
public class OptionDecorator implements Service {
private Service service;
private String label;
private double price;
public OptionDecorator(Service service, String label, double price) {
this.service = service;
this.label = label;
this.price = price;
}
public double getPrice() {
return this.price + service.getPrice();
}
public String getLabel() {
return this.label + service.getLabel();
}
}
๊ทธ๋ฆฌ๊ณ ์ต์
์์ฒด(์ง๊ธ๊น์ง 2๊ฐ):
public class Aura extends OptionDecorator {
public Aura(Service service) {
super(service, "ะฅะฐัะฐะบัะตัะธััะธะบะฐ ะฐััั", 1500);
}
}
public class Chakra extends OptionDecorator {
public Chakra(Service service) {
super(service, "ะฅะฐัะฐะบัะตัะธััะธะบะฐ ัะฐะบั", 500);
}
}
๊ธ์์, ์ฃผ๋ฌธ ์์ฒด๋
public static void main(String[] args) {
// ะะฐะดะฐะฝะธะต ะฝะฐ ะขะฐัะพ
Service taro = new Divination("ะขะฐัะพ", 1000);
Service chakra = new Chakra(taro);
Service aura = new Aura(chakra);
// ะ ะพะฑัะฐั ััะพะธะผะพััั
System.out.println(aura.getPrice());
}
3000.0
์ด๋ ๊ธฐ๋ณธ ์๋น์ค์ 2๊ฐ์ ์ถ๊ฐ ์ต์
์ ํฉํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฆ, ๋ชจ๋ ์ถ๊ฐ ์์
์ด ํ์ํ์ง ์์ต๋๋ค. ์ต์
(๋๋ ๋ ๋ค์ ์กฐํฉ)์ ์ฌ์ฉํ์ฌ ์ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค. ๋ํ, ์ด๋ฌํ ์ต์
์ ์ด์ธ ์๋น์ค๋ฟ๋ง ์๋๋ผ ์ด์ธ ์๋น์ค์๋ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๊น์ด ์์ผ ๋ด์ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ์ต์
์ ๊ตฌํํด์ผ ํ ๊ฒฝ์ฐ: - ์์
๋คํธ์ํฌ์์ ์๋ฐํ ํํธ๋์ ํธํ์ฑ - ์๊ฒฉ ์ฑ๋๋ง์ ํตํ ํ๊ธ ํ๋ฆ ๊ฐ์ , 2๊ฐ์ ์ถ๊ฐ ํด๋์ค๋ง ์์ฑํ๋ฉด ๋ฉ๋๋ค.
public class Channeling extends OptionDecorator {
public Channeling(Service service) {
super(service, "ะะพะปะตั ะฒ ะะพะปะต ะงัะดะตั", 99999);
}
}
public class Avatar extends OptionDecorator {
public Avatar(Service service) {
super(service, "ะะฐัะฐ ะปัะฑะพะฒั ะฒ ัะพั ัะตััั
", 5555);
}
}
๋ชจ๋ ์๋น์ค์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
public static void main(String[] args) {
// ะะฐะดะฐะฝะธะต ะฝะฐ ะขะฐัะพ
Service taro = new Divination("ะขะฐัะพ", 1000);
Service chakra = new Chakra(taro);
Service aura = new Aura(chakra);
// ะ ะพะฑัะฐั ััะพะธะผะพััั
System.out.println(aura.getPrice());
// ะะพัะพัะบะพะฟ
Service horoscope = new Horoscope("ะะตััะพะฝะฐะปัะฝัะน ะณะพัะพัะบะพะฟ", 1000);
Service channenling = new Channeling(horoscope);
Service avatar = new Avatar(channenling);
// ะ ะพะฑัะฐั ััะพะธะผะพััั
System.out.println(avatar.getPrice());
}
๊ทธ๋ฆฌ๊ณ (์ฐ๋ฆฌ์๊ฒ ํ์ํ) ํ๋ก๊ทธ๋จ์ ๊ฒฐ๊ณผ:
3000.0
106554.0
GO TO FULL VERSION