μν ν¨ν΄μ΄λ νμ ν¨ν΄ μ€ νλλ‘, κ°μ²΄κ° νΉμ μνμ λ°λΌ λμμ λ€λ₯΄κ² νλ μν©μμ 쑰건문μΌλ‘ λΆκΈ°νλ λμ μν μ체λ₯Ό κ°μ²΄ννμ¬ νλ κ²°μ μ μμνλ ν¨ν΄μ λ§νλ€. μνλ κ°μ²΄κ° κ°μ§ μ μλ μ΄λ€ 쑰건μ΄λ μν©μ λ§νλ€. μ£Όλ‘ λ€μκ³Ό κ°μ κ²½μ°μ μ¬μ©νλ€.
1. κ°μ²΄μ νλμ΄ μνμ λ°λΌ λ¬λΌμ§ λ
2. κ°μ²΄μ μ½λκ° μν μ νμ λ°λ₯Έ 쑰건문μΌλ‘ 볡μ‘ν΄μ§ λ
μν ν΄λμ€λ μνμ λ°λΌ νλμ ꡬννκ³ , κ°μ²΄λ κ·Έ μνλ₯Ό κ°μ§λ©° μνμ λ°λΌ μ μ ν νλμ μ·¨νλ€. μλ₯Ό λ€μ΄, μνκΈ°λ λμ΄ μΆ©λΆν λ€μ΄μ€μ§ μμΌλ©΄ λ²νΌμ΄ νμ±νλμ§ μλλ€. μνκΈ°λ λμ΄ λ€μ΄μ¨ μνμ, λμ΄ λ€μ΄μ€μ§ μμ μνμ λ°λΌ νμκ° λ¬λΌμ§λ€.
// μν μΈν°νμ΄μ€
interface VendingMachineState {
void insertCoin();
void ejectCoin();
void dispense();
}
// μν ꡬν ν΄λμ€
// λμ΄ λ€μ΄μ€μ§ μμ μν
class NoCoinState implements VendingMachineState {
@Override
public void insertCoin() {
System.out.println("μ
κΈλμμ΅λλ€. HasCoinState μνλ‘ μ νν©λλ€.");
// HasCoinState μνλ‘ μ νν¨
vendingMachine.setState(new HasCoinState());
}
@Override
public void ejectCoin() {
System.out.println("μλ μμ.");
}
@Override
public void dispense() {
System.out.println("μ
κΈλμ§ μμ μν: λ¨Όμ μ
κΈν΄μ£ΌμΈμ.");
}
}
class HasCoinState implements VendingMachineState {
// λμ΄ λ€μ΄μ¨ μνμ νλμ μ μνλ€.
}
// μνλ₯Ό κ°μ§ κ°μ²΄
class VendingMachine {
// μνλ₯Ό λ©€λ² νλλ‘ κ°μ§κ³ μμ.
private VendingMachineState currentState;
public VendingMachine() {
// μ΄κΈ° μν μ€μ
currentState = new NoCoinState();
}
// μν λ³κ²½
public void setState(VendingMachineState state) {
this.currentState = state;
}
// λμμ νμ¬ μνμ μμ
public void insertCoin() {
currentState.insertCoin();
}
public void ejectCoin() {
currentState.ejectCoin();
}
public void dispense() {
currentState.dispense();
}
}
public class Main {
public static void main(String[] args) {
VendingMachine vendingMachine = new VendingMachine();
vendingMachine.insertCoin(); // μ
κΈλμμ΅λλ€. HasCoinState μνλ‘ μ νν©λλ€.
vendingMachine.ejectCoin(); // μλμ΄ λμ΅λλ€.
vendingMachine.dispense(); // μ
κΈλμ§ μμ μν: λ¨Όμ μ
κΈν΄μ£ΌμΈμ.
vendingMachine.insertCoin(); // μ
κΈλμμ΅λλ€. HasCoinState μνλ‘ μ νν©λλ€.
vendingMachine.dispense(); // μλ£κ° λμ΅λλ€. NoCoinState μνλ‘ μ νν©λλ€.
}
}
μνκΈ°λ λμ κ°μ§ μν(`HasCoinState`)μ λμ΄ μλ μν(`NoCoinState`) λκ°μ§ μνλ₯Ό κ°μ§ μ μλ€. κ°μ νμλ₯Ό ꡬννλ, μνμ λ°λΌ λ€λ₯Έ νλμ νλ€. μκΈ° μνκΈ° μ½λμμλ λ μν λͺ¨λ `insertCoin()` `ejectCoin()` `dispense()`λ₯Ό ꡬννμ§λ§ μνμ λ°λΌ νμκ° λ€λ₯΄κ² μ€λ²λΌμ΄λ© λμ΄μλ€. `NoCoinState` μνμμλ `dispense()` λ©μλλ₯Ό μ¬μ©νλλΌλ μ κΈλμ§ μμ μνμ΄λ―λ‘ μλ£κ° λμ€μ§ μλλ€. λ°λ©΄μ `HasCoinState` μνλΌλ©΄ κ°μ `dispense()` λ©μλλ₯Ό μ¬μ©ν΄λ μλ£κ° λμ¨λ€. λ§μ½ μν μμ΄ λͺ¨λ μν©μ ꡬννλ € νλ€λ©΄ μ½λκ° κΈΈκ³ λ³΅μ‘ν΄μ‘μ κ²μ΄λ€.
if(money - selectBaverage < 0){
System.out.println("μμ‘μ΄ λΆμ‘±ν©λλ€.");
}else{
System.out.println("μλ£κ° λμ΅λλ€.");
}
if(currentMoney > 0){
System.out.println("κ±°μ€λ¦λμ΄ λμ΅λλ€.");
}else{
System.our.println("κ±°μ€λ¦λμ΄ μμ΅λλ€.");
}
.
.
.
μ€μ λ‘ μνκ° λ§μμ§λ€λ©΄ 쑰건문μ λ 볡μ‘ν΄μ§κ³ μ½λλ κ±·μ‘μ μ μμ΄ κΈΈμ΄μ§κ² λλ€. μ΄μ²λΌ κ°λ μ±μ΄ λ¨μ΄μ§λ 쑰건문 λμ μν ν¨ν΄μ μ¬μ©νλ©΄ μ μ§λ³΄μκ° μ©μ΄ν΄μ§λ€.
μ μλͺ¨λ, μ¨μλͺ¨λ, λμλͺ¨λ, μ΄λ¦°μ΄ λ³΄νΈ λͺ¨λ, μ²μ λͺ¨λ, μΌμ μ 무μ μ¬λ¬ μνλ₯Ό κ°μ§κ³ μλ μ μκΈ°λ₯Ό μ½λλ‘ μμ±νλ€λ©΄ λ€μκ³Ό κ°λ€.
// μν μΈν°νμ΄μ€
interface WaterMode {
void dispenseWater();
void dispenseIce();
}
// μν ꡬν
class HotWaterMode implements WaterMode{
@Override
public void dispenseWater() {
System.out.println("μ¨μκ° λμ΅λλ€.");
}
@Override
public void dispenseIce() {
System.out.println("μΌμμ΄ λμ΅λλ€.");
}
@Override
public String toString() {
return "μ¨μ λͺ¨λ";
}
}
class ColdWaterMode implements WaterMode {
@Override
public void dispenseWater() {
System.out.println("λμκ° λμ΅λλ€.");
}
@Override
public void dispenseIce() {
System.out.println("μΌμμ΄ λμ΅λλ€.");
}
@Override
public String toString() {
return "λμ λͺ¨λ";
}
}
class PurifiedWaterMode implements WaterMode {
@Override
public void dispenseWater() {
System.out.println("μ μκ° λμ΅λλ€.");
}
@Override
public void dispenseIce() {
System.out.println("μΌμμ΄ λμ΅λλ€.");
}
@Override
public String toString() {
return "μ μ λͺ¨λ";
}
}
class CleanMode implements WaterMode {
@Override
public void dispenseWater() {
System.out.println("μ²μκ° μ§ν μ€μ΄λ―λ‘ λ¬Όμ΄ λμ€μ§ μμ΅λλ€.");
}
@Override
public void dispenseIce() {
System.out.println("μ²μκ° μ§ν μ€μ΄λ―λ‘ μΌμμ΄ λμ€μ§ μμ΅λλ€.");
}
@Override
public String toString() {
return "μ²μ λͺ¨λ";
}
}
class WaterDispenser implements WaterMode{
public WaterMode waterMode;
public boolean childProtectMode;
public WaterDispenser(WaterMode waterMode, boolean childProtect) {
this.waterMode = waterMode;
this.childProtectMode = childProtect;
}
@Override
public void dispenseWater() {
waterMode.dispenseWater();
}
@Override
public void dispenseIce() {
waterMode.dispenseIce();
}
public void setWaterMode(WaterMode newMode){
if(childProtectMode && newMode instanceof HotWaterMode) {
System.out.println("μ΄λ¦°μ΄ λͺ¨λ νμ±ν : μ¨μ λͺ¨λλ‘ μ νν μ μμ΅λλ€.");
}else{
this.waterMode = newMode;
System.out.println(newMode + "λ‘ μ νν©λλ€.");
}
}
public void setChildProtectMode(Boolean childProtectMode){
System.out.println("μ΄λ¦°μ΄ λͺ¨λλ₯Ό" + (childProtectMode ? " " : " λΉ") + "νμ±νν©λλ€.");
this.childProtectMode = childProtectMode;
}
}
// ν΄λΌμ΄μΈνΈ μ½λ
public class main {
public static void main(String[] args) {
WaterDispenser waterDispenser = new WaterDispenser(new ColdWaterMode(), true);
waterDispenser.dispenseWater(); // λμκ° λμ΅λλ€.
waterDispenser.dispenseIce(); // μΌμμ΄ λμ΅λλ€.
// μ μ λͺ¨λλ‘ μ ν
waterDispenser.setWaterMode(new PurifiedWaterMode());
waterDispenser.dispenseWater(); // μ μκ° λμ΅λλ€.
waterDispenser.setChildProtectMode(true); // μ΄λ¦°μ΄ λͺ¨λλ₯Ό νμ±νν©λλ€.
waterDispenser.setWaterMode(new HotWaterMode()); // μ΄λ¦°μ΄ λͺ¨λ: μ¨μ λͺ¨λλ‘ μ νν μ μμ΅λλ€.
waterDispenser.dispenseIce(); // μΌμμ΄ λμ΅λλ€.
// μ²μ λͺ¨λλ‘ μ ν
waterDispenser.setWaterMode(new CleanMode());
waterDispenser.dispenseWater(); // μ²μκ° μ§ν μ€μ΄λ―λ‘ λ¬Όμ΄ λμ€μ§ μμ΅λλ€.
waterDispenser.dispenseIce(); // μ²μκ° μ§ν μ€μ΄λ―λ‘ μΌμμ΄ λμ€μ§ μμ΅λλ€.
waterDispenser.setChildProtectMode(false);
// μ¨μ λͺ¨λλ‘ μ ν
waterDispenser.setWaterMode(new HotWaterMode());
waterDispenser.dispenseWater(); // μ¨μκ° λμ΅λλ€.
}
}
μ μκΈ° κ°μ²΄κ° μνμ λ°λΌ νμκ° λ¬λΌμ§κ³ μμΌλ―λ‘ λ§μΉ λ€λ₯Έ κ°μ²΄λ‘ λ³κ²½λλ κ²μ²λΌ 보μΈλ€. μ΄μ²λΌ μν ν¨ν΄μ μ¬μ©νλ©΄ κ°μ²΄ ν¨ν΄μ΄ μνμ λ°λΌ νλμ κ°μ²΄λ‘ κ°κΈ° λ€λ₯Έ λμμ μνν μ μλ€.
π μ°Έκ³
μκΈ° μ½λμμ μνλ₯Ό λ³κ²½ν λλ§λ€ λ§€λ² new μμ±μλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±νμμΌλ μ€μ μ€ν μ€μ κ°μ²΄ μμ±μ λ¨λ°νλ κ²μ κ°λΉμ§ 컬λ ν°μ κ°μ²΄ μ κ±° κ³Όμ μμ Stop-the-worldλ₯Ό μ λ°μν¬ μ μλ€. λ°λΌμ μν κ°μ²΄λ₯Ό μ±κΈν€ ν¨ν΄μΌλ‘ ꡬνν κ²μ κ³ λ €νλ€.
β¨ μ₯μ
1. νλμ κ°μ²΄λ₯Ό νλμ νλλ§ μ¬μ©νμ¬ μνλ₯Ό λ³κ²½νλ―λ‘ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλ€.
2. μ¬λ¬ λΆκΈ°λ‘ μμ±λ 쑰건문μ λΉν΄ κ°λ μ±μ΄ μ°μν΄μ§λ€.
3. μλ‘μ΄ μνλ₯Ό μΆκ°νκ±°λ λ³κ²½νλλΌλ κΈ°μ‘΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μμ νμ§ μμλ λλ€. μ΄λ κ°μ²΄ μ§ν₯ 5λ μμΉ μ€ νλμΈ κ°λ°© νμ μμΉ(OCP: Open-Closed Principle)μ λΆν©νλ€.
4. κ°μ²΄κ° λ€μμ μ΄λ€ μνλ‘ μ μ΄λ μ§ λͺ ννκ² νμ ν μ μλ€.
5. κ° μνκ° λ 립λ κ°μ²΄λ‘ μ‘΄μ¬νλ―λ‘ ν μ€νΈνκΈ°μ μ©μ΄νλ€.
π λ¨μ
1. μνκ° μ¦κ°ν λλ§λ€ ν΄λμ€ μκ° μ¦κ°νλ€. μνλ₯Ό κ΄λ¦¬νκΈ° μν΄ ν΄λΉ ν΄λμ€ νμΌμ μ°ΎμμΌνλ λ²κ±°λ‘μμ΄ λ°μν μ μλ€.
2. μν κ°μ 곡ν΅λ λμμ΄ λ§κ³ ν¬κ² λ€λ₯΄μ§ μμ κ²½μ° μ€νλ € μ μ§ λ³΄μμ μ΄λ €μμ λν μ μλ€.
3. λͺ¨λ μνκ° λ―Έλ¦¬ μ μλμ΄ μμΌλ―λ‘ μ μ°νκ² λμμ λ³κ²½νλ κ²μ΄ μ΄λ €μΈ μ μλ€.
μν ν¨ν΄μ μ¬μ©ν¨μΌλ‘μ¨ μ·¨νλ μ₯μ μ΄ λ¨μ λ³΄λ€ μ λ€λ©΄ λ€λ₯Έ λμμΈ ν¨ν΄μ κ³ λ €νλ€.
'CS > λμμΈ ν¨ν΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λμμΈ ν¨ν΄] λ°μ½λ μ΄ν°(Decorator) ν¨ν΄ (0) | 2024.01.13 |
---|---|
[λμμΈ ν¨ν΄] νλ‘μ(Proxy) ν¨ν΄ (0) | 2024.01.13 |
[λμμΈ ν¨ν΄] μ±κΈν€(Singleton) ν¨ν΄ (0) | 2024.01.10 |
[λμμΈ ν¨ν΄] ν©ν 리 λ©μλ(Factory Method) ν¨ν΄ (0) | 2024.01.10 |