컴포지트 패턴

'''컴포지트 패턴'''(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
480px
=== 자바 ===
import java.util.List;
import java.util.ArrayList;
/** "Component" */
interface Graphic {
    //Prints the graphic.
    public void print();
}
/** "Composite" */
class CompositeGraphic implements Graphic {
    //Collection of child graphics.
    private List mChildGraphics = new ArrayList();
    //Prints the graphic.
    public void print() {
        for (Graphic graphic : mChildGraphics) {
            graphic.print();
        }
    }
    //Adds the graphic to the composition.
    public void add(Graphic graphic) {
        mChildGraphics.add(graphic);
    }
    //Removes the graphic from the composition.
    public void remove(Graphic graphic) {
        mChildGraphics.remove(graphic);
    }
}
/** "Leaf" */
class Ellipse implements Graphic {
    //Prints the graphic.
    public void print() {
        System.out.println("Ellipse");
    }
}
/** Client */
public class Program {
    public static void main(String args) {
        //Initialize four ellipses
        Ellipse ellipse1 = new Ellipse();
        Ellipse ellipse2 = new Ellipse();
        Ellipse ellipse3 = new Ellipse();
        Ellipse ellipse4 = new Ellipse();
        //Initialize three composite graphics
        CompositeGraphic graphic = new CompositeGraphic();
        CompositeGraphic graphic1 = new CompositeGraphic();
        CompositeGraphic graphic2 = new CompositeGraphic();
        //Composes the graphics
        graphic1.add(ellipse1);
        graphic1.add(ellipse2);
        graphic1.add(ellipse3);
        graphic2.add(ellipse4);
        graphic.add(graphic1);
        graphic.add(graphic2);
        //Prints the complete graphic (four times the string "Ellipse").
        graphic.print();
    }
}
=== C++ ===
+ '''출력 결과'''
 Container 1:
    0
    1
 Container 2:
    2
    3
    4
#include 
#include 
#include 
using std::cout;
using std::vector;
using std::string;
class Component
{
  public:
   virtual void list() const = 0;
   virtual ~Component(){};
};
class Leaf : public Component
{
  public:
   explicit Leaf(int val) : value_(val)
   {
   }
   void list() const
   {
      cout ::const_iterator it = table_.begin();
       it != table_.end(); ++it)
      {
         (*it)->list();
      }
   }
  private:
   vector  table_;
   string id_;
};
int main()
{
   Leaf num0(0);
   Leaf num1(1);
   Leaf num2(2);
   Leaf num3(3);
   Leaf num4(4);
   Composite container1("Container 1");
   Composite container2("Container 2");
   container1.add(&num0);
   container1.add(&num1);
   container2.add(&num2);
   container2.add(&num3);
   container2.add(&num4);
   container1.add(&container2);
   container1.list();
   return 0;
}
=== Python3 ===
from abc import abstractmethod
class Component:
    @abstractmethod
    def my_list(self):
        pass
class Leaf(Component):
    val = None
    
    def __init__(self, val) -> None:
        super().__init__()
        self.val = val
    
    def my_list(self):
        print(self.val)
class Composite(Component):
    val = None
    composite_list = None
    def __init__(self, val) -> None:
        super().__init__()
        self.val = val
    
    def add(self, obj):
        if not self.composite_list:
            self.composite_list = 
        self.composite_list.append(obj)
    def my_list(self):
        print(self.val, ":")
        for obj in self.composite_list:
            obj.my_list()
        
def main():
    num0 = Leaf(0)
    num1 = Leaf(1)
    num2 = Leaf(2)
    num3 = Leaf(3)
    num4 = Leaf(4)
    container1 = Composite("Container 1")
    container2 = Composite("Container 2")
    container1.add(num0)
    container1.add(num1)
    container2.add(num2)
    container2.add(num3)
    container2.add(num4)
    container1.add(container2)
    container1.my_list()
if __name__ == "__main__":
    main()
분류:소프트웨어 디자인 패턴