Composite

What isโ”

Composite ํŒจํ„ด์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๋ณตํ•ฉ ๊ฐ์ฒด(Composite)์™€ ๋‹จ์ผ ๊ฐ์ฒด(Leaf)๋ฅผ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

       +----------------+
       |    Graphic     |  <-- ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค
       +----------------+
              /  \
             /    \
            /      \
  +---------------+   +--------------------+
  |    Ellipse    |   | CompositeGraphic   |
  |   (Leaf)      |   |   (Composite)      |
  +---------------+   +--------------------+
                          /      |       \
                         /       |        \
                        /        |         \
               +----------+ +----------+ +----------+
               | Graphic  | | Graphic  | | Graphic  |
               | (Leaf or | | (Leaf or | | (Leaf or |
               | Composite)| | Composite)| | Composite)|
               +----------+ +----------+ +----------+

์ฆ‰, ์‚ฌ์šฉ์ž๋Š” ๊ฐœ๋ณ„ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์€ ์ „์ฒด-๋ถ€๋ถ„ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ๊ณ„์ธต์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.


How do Codeโ”

  • ์žฅ์ : ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋ฉฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹จ์ : ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค: Leaf์™€ Composite ๋ชจ๋‘ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
public interface Graphic {
    void draw();
}

// Leaf ํด๋ž˜์Šค: ๋” ์ด์ƒ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ์—†๋Š” ๊ฐœ๋ณ„ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
public class Ellipse implements Graphic {
    private final String name;

    public Ellipse(String name) {
        this.name = name;
    }

    @Override
    public void draw() {
        System.out.println("Ellipse ๊ทธ๋ฆฌ๊ธฐ: " + name);
    }
}

// Composite ํด๋ž˜์Šค: ํ•˜๋‚˜ ์ด์ƒ์˜ Graphic ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ๋ณตํ•ฉ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
public class CompositeGraphic implements Graphic {
    private final List<Graphic> children = new ArrayList<>();

    // ์ž์‹ ์ถ”๊ฐ€
    public void add(Graphic graphic) {
        children.add(graphic);
    }

    // ์ž์‹ ์ œ๊ฑฐ
    public void remove(Graphic graphic) {
        children.remove(graphic);
    }

    @Override
    public void draw() {
        System.out.println("CompositeGraphic ๊ทธ๋ฆฌ๊ธฐ ์‹œ์ž‘");
        for (Graphic graphic : children) {
            graphic.draw();
        }
        System.out.println("CompositeGraphic ๊ทธ๋ฆฌ๊ธฐ ์ข…๋ฃŒ");
    }
}

// ์‚ฌ์šฉ ์˜ˆ์ œ
public class CompositePatternDemo {
    public static void main(String[] args) {
        // Leaf ๊ฐ์ฒด ์ƒ์„ฑ
        Ellipse ellipse1 = new Ellipse("Ellipse 1");
        Ellipse ellipse2 = new Ellipse("Ellipse 2");
        Ellipse ellipse3 = new Ellipse("Ellipse 3");

        // Composite ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ Leaf ๊ฐ์ฒด ์ถ”๊ฐ€
        CompositeGraphic compositeGraphic = new CompositeGraphic();
        compositeGraphic.add(ellipse1);
        compositeGraphic.add(ellipse2);

        // ๋˜ ๋‹ค๋ฅธ Composite ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ Leaf, Composite ์ถ”๊ฐ€
        CompositeGraphic complexGraphic = new CompositeGraphic();
        complexGraphic.add(ellipse3);
        complexGraphic.add(compositeGraphic);

        // ์ „์ฒด ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด draw() ํ˜ธ์ถœ
        complexGraphic.draw();
    }
}
  • ๋ชฉ์ : ์ „์ฒด-๋ถ€๋ถ„ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜์—ฌ, ๋‹จ์ผ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•จ

  • ์žฅ์ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณตํ•ฉ ๊ตฌ์กฐ์˜ ๋‚ด๋ถ€ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

  • ์ ์šฉ ์˜ˆ: ๊ทธ๋ž˜ํ”ฝ, ํŒŒ์ผ ์‹œ์Šคํ…œ, UI ์ปดํฌ๋„ŒํŠธ ๋“ฑ ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•จ

Last updated