작심삼일

9주차-1. Composite 본문

스터디/디자인 패턴

9주차-1. Composite

yun_s 2021. 7. 21. 21:51
728x90
반응형

디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.

틀린 부분은 알려주시면 감사하겠습니다.

어떤 패턴인가

부분과 전체의 계층을 표현하기 위해 객체들을 모아 트리 구조로 구성합니다.

사용자로 하여금 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있도록 하는 패턴입니다.

 

새로운 클래스가 추가돼도 일괄적인 접근 방법을 제공하기 때문에 연산, 관리가 쉽다.

하지만 단일 객체와 복합 객체의 설계를 일반화시키기 때문에 각각의 객체에 다른 연산을 적용하기 어렵다.


어떻게 쓰는가

Component(Graphic): 집합 관계에 정의될 모든 객체에 대한 인터페이스를 정의합니다.

                             모든 클래스에 해당하는 인터페이스에 대해서는 공통의 행동을 구현합니다.

                             전체 클래스에 속한 요소들을 관리하는 데 필요한 인터페이스를 정의합니다.

Leaf(Rectangle, Line, Text, 기타): 가장 말단의 객체, 즉 자식이 없는 객체를 나타냅니다

Composite(Picture): 자식이 있는 구성요소에 대한 행동을 정의합니다.

Client: Component 인터페이스를 통해 복합 구조 내의 객체들을 조작합니다.

class Shape:
    def draw(self, color):
        pass

class Circle(Shape):
    def __init__(self):
        print('Circle')
    
    def draw(self, color):
        print('Draw circle with color ' + color)
        
class Rectangle(Shape):
    def __init__(self):
        print('Rectangle')
        
    def draw(self, color):
        print('Draw rectangle with color ' + color)
        
class Control(Shape):
    def __init__(self):
        shapes = []
        
    def add(self, newShape):
        shapes.append(newShape)
    
    def remove(self, rShape):
        if rShape in shapes:
        	shape.remove(rShape)
    
    def draw(self, color):
        for shape in shapes:
            shape.draw(color)
------------------------------------------------------
circle = Circle()
rectangle = Rectangle()
c = Control()

Control.add(circle)
Control.add(rectangle)

Control.draw('red')
# Draw circle with color red
# Draw rectangle with color red

어디서 활용되는가

이는 책의 내용 (p. 228)을 그대로 가져왔다.

1. 부분-전체의 객체 계통을 표현하고 싶을 때

2. 사용자가 객체의 합성으로 생긴 복합 객체와 개개의 객체 사이의 차이를 알지 않고도 자기 일을 할 수 있도록 만들고 싶을 때


Chain of responsibility 와 Composite 은 어디서, 어떻게 같이 사용되나?

Chain of responsibility는 각각의 객체에게 각각의 역할을 준다.

Composite는 트리구조로 이루어져있는데, 차례로 각각의 일을 하게 할 때 Chain of responsibility를 사용할 수 있다.


My Opinion

Composite 패턴의 특징은 트리구조로 이루어져있다는 것이다.

폴더-파일 구조에서 주로 활용된다고 한다.

트리구조로 이루어진 데이터를 다룰 때 주로 활용될 것 같다.하지만 복잡한 트리구조를 잘 사용해보지 않아서 감이 더 잘 오지 않는 듯 하다.

728x90
반응형

'스터디 > 디자인 패턴' 카테고리의 다른 글

10주차. Memento  (0) 2021.07.28
9주차-2. Command  (0) 2021.07.21
8주차-2. Iterator  (0) 2021.07.08
8주차-1. Chain of responsibility  (0) 2021.07.08
7주차-2. Visitor  (0) 2021.06.23
Comments