컴포지트 패턴

컴포지트 패턴(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++**
#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()

**같이 보기**
 믹스인
분류:소프트웨어 디자인 패턴