JavaRush /Java Blog /Random-KO /์ž๋ฐ” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด

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

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์ฑ… 'ํ—ค๋“œ ํผ์ŠคํŠธ. 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
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION