๐ŸŽฐ Design Pattern

Composite Pattern | ์ปดํฌ์ง“ ํŒจํ„ด

์—ฐ_์šฐ๋ฆฌ 2022. 8. 15. 00:55
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์“ฐ์ผ๊นŒ?

    ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ€๋ฐฉ์— ๋„๋ž€๊ฒ€๊ณผ ์ฒด๋ ฅ๋ฌผ๋žต์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค

    ๋ณดํ†ต ์•„์ดํ…œ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๊ฐ€๊ฒฉ์ด ์ถœ๋ ฅ๋˜๋Š”๋ฐ, 

    ๋„๋ž€๊ฒ€ ๊ฐ€๊ฒฉ์„ ์ถœ๋ ฅํ•˜๋Š”๊ฒƒ์ด๋‚˜, ๊ฐ€๋ฐฉ์˜ ๋ชจ๋“  ์•„์ดํ…œ์˜ ๊ฐ€๊ฒฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‚˜

    ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ ์ž…์žฅ์—์„  ๋™์ผํ•˜๊ฒŒ ๊ฐ€๊ฒฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

     

    ๊ฐ€๋ฐฉ์€ ์•„์ดํ…œ์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ˆ ๊ฐ€๋ฐฉ์—.. ๊ฐ€๊ฒฉ ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด์•ผํ• ๊นŒ??

    ์•„๋‹ˆ๋ฉด ์•„์ดํ…œ์— ๊ฐ€๊ฒฉ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ

    ๊ฐ€๋ฐฉ์˜ ๋ชจ๋“  ์•„์ดํ…œ ๊ฐ€๊ฒฉ์„ ์ถœ๋ ฅํ•  ๋• ์•„์ดํ…œ ์ „์ฒด๋ฅผ ์ˆœํšŒํ•ด์•ผํ• ๊นŒ???

     

     

    ์ปดํฌ์ง“ ํŒจํ„ด์ด๋ž€?

    ๊ทธ๋ฃน ์ „์ฒด์™€ ๊ฐœ๋ณ„ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์ด๋‹ค.

    ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ ์ „์ฒด๋‚˜ ๋ถ€๋ถ„์ด๋‚˜ ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.

    ๋‹ค์‹œ๋งํ•ด ์ผ๊ด„์ ์ธ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ๋œ๋‹ค!

     

     

    * ํŠธ๋ฆฌ๊ตฌ์กฐ์ด์–ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์‚ฌํ•ญ์ด ์žˆ๋‹ค!

     

    ์žฅ์ 

    - ๋ณต์žกํ•œ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

    - ๋‹คํ˜•์„ฑ๊ณผ ์žฌ๊ท€ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

    - ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ ํƒ€์ž…์ด ์ถ”๊ฐ€๋˜์–ด๋„ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค (printPrice(Component component))

     

    ๋‹จ์ 

    - ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๋‚˜์น˜๊ฒŒ ์ผ๋ฐ˜ํ™”ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค

    (์ง€๊ธˆ์€ ์•„์ดํ…œ๊ณผ ๊ฐ€๋ฐฉ์ด๋‹ˆ ์—ฐ๊ด€์„ฑ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ.. ์•„์˜ˆ ๋‹ค๋ฅธ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๊ฒฝ์šฐ๋Š” ์˜คํžˆ๋ ค ์ปดํฌ์ง“ํŒจํ„ด์ด ๋ฐœ๋ชฉ์„ ์žก๋Š”๋‹ค!)

     

     

     

     

    ๊ตฌํ˜„์ฝ”๋“œ

    ๊ธฐ์กด์ฝ”๋“œ

    public class Client {
    
        public static void main(String[] args) {
            Item doranBlade = new Item("๋„๋ž€๊ฒ€", 450);
            Item healPotion = new Item("์ฒด๋ ฅ ๋ฌผ์•ฝ", 50);
    
            Bag bag = new Bag();
            bag.add(doranBlade);
            bag.add(healPotion);
    
            Client client = new Client();
            client.printPrice(doranBlade);
            client.printPrice(bag);
        }
    
        private void printPrice(Item item) {
            System.out.println(item.getPrice());
        }
    
        private void printPrice(Bag bag) {
            int sum = bag.getItems().stream().mapToInt(Item::getPrice).sum();
            System.out.println(sum);
        }
    
    }

    ์•„์ดํ…œ ์œ ํ˜•์ด ์•„์ดํ…œ์ธ์ง€, ๊ฐ€๋ฐฉ์ธ์ง€์— ๋”ฐ๋ผ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค

    public class Bag {
    
        private List<Item> items = new ArrayList<>();
    
        public void add(Item item) {
            items.add(item);
        }
    
        public List<Item> getItems() {
            return items;
        }
    }

     

     

     

    ๋ณ€๊ฒฝ์ฝ”๋“œ

    public interface Component {
        int getPrice();
    }
    public class Bag implements Component {
    
        private List<๐Ÿ”ฅComponent> components = new ArrayList<>();
    
        public void add(๐Ÿ”ฅComponent component) {
            components.add(component);
        }
    
        public List<๐Ÿ”ฅComponent> getComponents() {
            return components;
        }
    
        @Override
        public int getPrice() {
            return components.stream().mapToInt(Component::getPrice).sum();
        }
    }
    public class Client {
    
        public static void main(String[] args) {
            Item doranBlade = new Item("๋„๋ž€๊ฒ€", 450);
            Item healPotion = new Item("์ฒด๋ ฅ ๋ฌผ์•ฝ", 50);
    
            Bag bag = new Bag();
            bag.add(doranBlade);
            bag.add(healPotion);
    
            Client client = new Client();
            client.printPrice(doranBlade);
            client.printPrice(bag);
        }
    
        private void printPrice(Component component) {
            System.out.println(component.getPrice());
        }
    
    }

    ๊ฐ€๋ฐฉ๊ณผ ์•„์ดํ…œ ๋ชจ๋‘ Component๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค!

    ๊ฐ€๋ฐฉ๊ณผ ์•„์ดํ…œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋˜ ๋ฉ”์„œ๋“œ๋ฅผ Componentํ•˜๋‚˜๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ