μ»€νΌ μ λ¬Έμ μ μκ°ν΄λ³΄μ.
κ°μ²΄ λ§μμ μ€νλ²μ¦λΌλ 컀νΌμμ΄ μλ€.
컀νΌμ μ’ λ₯λ μ¬λ¬κ°μ§μ μΆκ°ν μ μλ λ©λ΄κ° μμκ°μ§κ° λ μλ μλ€.
λ€μ κ·Έλ¦Όμ 보μ.
μ΄λ κ² ν΄λμ€ κ°μκ° μμ²λκ² λμ΄λλ€. μ»€νΌ λ©λ΄κ° λ λμ΄λλ©΄ ν¨μ¬ λ λμ΄λ κ²μ΄λ€.
μμμ΄ κ°λ ₯νκΈ΄ νμ§λ§, λͺ¨λ μλΈ ν΄λμ€μμλ λκ°μ νλμ μμλ°κ² λλ€.
μ΄λ΄λ, ꡬμ±μ ν΅ν΄μ νλμ νμ₯νκ² λλ©΄ μ€νμ€μ λμ μΌλ‘ νλμ μ€μ ν μμλ€. (μ€νΈλ ν°μ§ ν¨ν΄)
λμμΈ μμΉ ) ν΄λμ€λ νμ₯μ λν΄μλ μ΄λ €μμ΄μΌ νμ§λ§,
μ½λ λ³κ²½μ λν΄μλ λ«ν μμ΄μΌ νλ€.
O.C.P ( Open-Closed Principle)
*무쑰건 OCPλ₯Ό μ μ©νλ κ²μ μκ° λλΉκ° λ μλ μλ€. μ½λλ₯Ό νμ₯ν΄μΌ ν λΆλΆμ μ νν λλ μΈμ¬ν μ£Όμλ₯Ό κΈ°μΈμ¬μΌ νλ€.
μ»€νΌ λ©λ΄ μ€ DarkRoast λ©λ΄λ₯Ό νλ² μ΄ν΄ 보μ.
DarkRoast 컀νΌμ Whip, Mochaλ₯Ό μΆκ° νλ€κ³ ν΄λ³΄μ.
cost() λ©μλλ‘ μ΄ μλ£λ₯Ό κ³μ°μ ν΄λ³΄μ.
μ΄λ»κ² μ΄κ² κ°λ₯νκ²μΈμ§, μ΄λ°κ° μ½λλ‘ μ΄ν΄λ³΄μ.
λ°μ½λ μ΄ν° ν¨ν΄ ) κ°μ²΄μ μΆκ°μ μΈ μ건μ λμ μΌλ‘ 첨κ°νλ€. λ°μ½λ μ΄ν°λ μλΈν΄λμ€λ₯Ό
λ§λλ κ²μ ν΅ν΄ κΈ°λ₯μ μ μ°νκ² νμ₯ν μ μλ λ°©λ²μ μ 곡νλ€.
*λ°μ½λ μ΄ν° ν¨ν΄ : ν΄λμ€ λ€μ΄μ΄κ·Έλ¨
StarBuzz μ»€νΌ : ν΄λμ€ λ€μ΄μ΄ κ·Έλ¨
#μ½λ
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "House Blend Coffee";
}
public double cost() {
return .89;
}
}
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) { //beverage κ°μ²΄λ μνΌν΄λμ€μμ μμλ°μλ€.
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return .20 + beverage.cost();
}
}
public class Soy extends CondimentDecorator {
public Soy(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
public double cost() {
return .15 + beverage.cost();
}
}
// main μ½λ
Beverage beverage = new HouseBlend();
beverage = new Mocha(beverage);
beverage = new Soy(beverage);
// μλ£ μ΄λ¦κ³Ό κ°κ²© μΆλ ₯.
System.out.println( beverage.getDescription() + "$" + beverage.cost() );
Beverage beverage = new HouseBlend();
//μ¬κΈ°μ HouseBlendμ μμ±μκ° νΈμΆμ΄ λλ€. descriptionμ Houseblendκ° μ μ₯λκ³ ,
//μΈμ€ν΄μ€ λ³μκ° λ©λͺ¨λ¦¬μ μ¬λΌκ°κ² λλ€.
berverge = new Mocha(beverage);
//Mocha μμ±μμ 맀κ°λ³μλ‘ HouseBlendκ°μ²΄λ₯Ό λ겨μ€λ€. κ·ΈλΌ beverageμ HouseBlendκ°μ²΄κ° μ μ₯λλ€.
beverage = new Soy(beverage);
//Soy μμ±μμ 맀κ°λ³μλ‘ Mochaκ°μ²΄λ₯Ό λ겨μ€λ€. κ·ΈλΌ beverageμ Mochaκ°μ²΄κ° μ μ₯λλ€.
//μ΄μ beverage.cost() λ₯Ό νΈμΆνκ² λλ©΄-
//λ§μ§λ§μ μ μ₯λ κ°μ²΄κ° Soy μ΄λ―λ‘ Soy.cost()κ° νΈμΆμ΄ λλ€.
/*
(μ€νλλ μμ) 1. Soy.cost() -> 2. Mocha.cost() -> 3. HouseBlend.cost()
------------------------------------------------------------------------------
1. 0.15 + (Mocha)beverage.cost()
2. 0.20 + 0.15 + (HouseBlend)beverage.cost()
3. 0.99 + 0.22 + 0.15
*/