컴퓨터/정보처리기사 SW 공학

| 니앙팽이 - 객체지향(OOP) | 4-3 | 구조패턴 - Composite pattern

객체지향

📕 4. 객체지향 디자인 패턴

유니티에서 사용하면 좋을 디자인 패턴만 명시한다.


📄 4. 구조 패턴

클래스나 객체를 조합하여 더 큰구조로 만드는 패턴


1). Composite Pattern

ⓐ 쓰는 이유?

컴포지트 패턴은 앱의 핵심 모델을 트리로 나타낼 수 있는 경우에만 의미가 있다.

  1. 여러 개체를 동일한 목적으로 사용하고 있으며 각 개체를 처리하는 코드가 거의 동일한 경우 컴포지트를 사용하는 것은 좋은 선택이다.
  2. 칼이면 휘두루고, 총이면 방아쇠를 당기는등. 컴포지트와 각기다른 객체의 차이를 무시하고 어쨌든 공격한다는 점에서 같은 동작처럼 사용하고 싶을때. Composite should be used when clients ignore the difference between compositions of objects and individual objects
  3. 트리 계층 구조에서 상속이 가지는 문제를 해결해준다. part-whole hierarchies
  4. 컴포지트 패턴은 모든 트리구조의 모든 컴포넌트를 재귀적으로 순회 가능하다.


ⓑ 구성요소

Case 1Case 2
  1. Component : 추상클래스 또는 인터페이스다.
  2. Leaf : LeafComponent 의 파생 클래스이다.
  3. Composite : 다른건 몰라도... 다음이 포함된다.
    1. Component 인스턴스를 담는 컨테이너 (List, Dictionary)
      private List<Component> components = new List<Component>();
      
    2. Component 컨테이너를 추가하거나 삭제하는 매서드
      public addComponent(Component _c) {
        components.Add(_c);
      }
      

ⓑ 예시

📂Composite Pattern (C#)📂
using System;
using System.Collections;
using System.Collections.Generic;

namespace DesignPattern
{
    internal class Composite {
        public interface Equipment_Composition {
            public void Equip();
            public void Dump();
        }

        public class Weapon_Leaf : Equipment_Composition {
            public void Equip(){/*...*/}
            public void Dump(){/*...*/}
        }
        public class Hat_Leaf : Equipment_Composition {
            public void Equip(){/*...*/}
            public void Dump(){/*...*/}
        }
        public class Body_Leaf : Equipment_Composition {
            public void Equip(){/*...*/}
            public void Dump(){/*...*/}
        }
        public class Accessories_Leaf : Equipment_Composition {
            public void Equip(){/*...*/}
            public void Dump(){/*...*/}
        }
        public class Player : Equipment_Composition {
            Array<Equipment_Composition> Equipments = new Array<Equipment_Composition>();

            public void 줍기(Equipment_Composition _장비){
                Equipments.Add(_장비);
            }

            public override void EquipAll(){
                foreach(Equipment_Composition E in Equipments){
                    E.Equip();
                }
            }
        }

        static void Main(string argv){
            Player Sophia = new Player();
            Weapon_Leaf sword = new Weapon_Leaf(); 
            Body_Leaf 철갑옷 = new Body_Leaf();
            
            Sophia.줍기(sword);
            Sophia.줍기(철갑옷);

            Sophia.EquipAll();
        } 
    }
}
📂Composite Pattern 2 (C#)📂
using System;
using System.Collections;
using System.Collections.Generic;

namespace DesignPattern
{
    internal class Composite {
        public interface Graphic {
            public void Print();
        }
        public class Ellipse : Graphic {
            static int ellipseNum = 0;
            private int order = 0;
            public Ellipse() {
                order = ellipseNum;
                ellipseNum++;
            }
            public void Print(){ Console.WriteLine($"{this.order} Ellipse"); }
        }

        public class Circle : Graphic {
            static int circleNum = 1;
            private int order = 0;
            public Circle() {
                order = circleNum;
                circleNum++;
            }
            public void Print(){ Console.WriteLine($"{this.order} Circle"); }
        }

        public class CompositeGrapic : Graphic {
            private readonly List<Graphic> graphics = new List<Graphic>();
            public void addGrapic(Graphic G){
                graphics.Add(G);
            }
            public void Print(){
                foreach(Graphic E in graphics){E.Print();}
            }            
        }

        static void Main(string argv){
            CompositeGrapic compositeGrapic = new CompositeGrapic();
            compositeGrapic.addGrapic(new Circle());
            compositeGrapic.addGrapic(new Circle());
            compositeGrapic.addGrapic(new Ellipse());
            compositeGrapic.addGrapic(new Circle());
            compositeGrapic.addGrapic(new Ellipse());
            compositeGrapic.addGrapic(new Ellipse());
            compositeGrapic.addGrapic(new Ellipse());

            compositeGrapic.Print();
        }
    }
}

참고

  1. 컴포 패턴
  2. 컴포 패턴
  3. 컴포 패턴