본문 바로가기
Theory/Design Pattern

Composite Pattern

by y.j 2022. 5. 5.
728x90

Composite Pattern

Composite는 Object를 tree구조로 표현하기 위해 사용한다. Composite는 Client가 object와 object의 구성품을 균일하게 다루게 한다.

어떻게 object를 tree구조로 구성할까?
Composite object를 가지고 어떻게 subtree를 구성할까?

Tree구조는 OOP syetem에서 매우 자주 사용하기 때문에 composite는 패턴은 유용하다. Tree구조는 Leaf Object와 Composite object로 구성되어 있다. Leaf Object는 Leaf Node와 같은 역할을 한다고 보면되고 Composite object는 중간 Node이라고 보면 된다. 그래서 Composite object는 children을 가질 수 있다. Client는 Object들을 균일하게 사용하기 위해서 interface를 활용하는데 client입장에서는 구현, 수정, 테스트, 재사용하기 편하다.

Solution

Component라는 interface를 두고 Leaf와 Composite이 모두 상속 받아 구현하도록 한다. 다만, Composite내부에 child list를 두어 child object를 저장 할 수 있도록 한다.

package CompositePattern.Basic;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Composite extends Component{

    private List<Component> children = new ArrayList<Component>();

    public Composite(String name) {
        super(name);
    }

    @Override
    public String operation() {
        Iterator<Component> it = children.iterator();
        String str = getName();
        Component child;
        while (it.hasNext()) {
            child = it.next();
            str += child.operation();
        }
        return str;
    }

    @Override
    public boolean add(Component child) {
        return children.add(child);
    }

    @Override
    public Iterator<Component> iterator() {
        return children.iterator();
    }
}

Client쪽은 단순히 Leaf와 Composite를 생성하기만 하면 된다.

    public void CompositePattern() {
        Component composite2 = new Composite("composite2 ");
        composite2.add(new Leaf("Leaf1 "));
        composite2.add(new Leaf("Leaf2 "));
        composite2.add(new Leaf("Leaf3 "));

        Component composite1 = new Composite("composite1 ");
        composite1.add(new Leaf("Leaf4 "));
        composite1.add(composite2);
        composite1.add(new Leaf("Leaf5 "));

        System.out.println("(1) " + composite1.operation());
        System.out.println("(2) " + composite2.operation());

    }

Advantages

• Client가 단순화된다.

 - 코드에서 봤듯이 Composite에다가 add로 create만 하면 된다.

• Component를 추가하기 쉽다.

 - Client Component interface를 참조하며 implementation에 독립적이다.

 - 따라서, 추가적인 Leaf class나 Composite class가 있을 경우 client가 변할 필요는 없다.

• run-time에 유동적으로 복잡한 구조를 변경하거나 빌드하는 것이 가능하다.

 - 재귀가 가능하다. 


Disadvantages

• Uniformity versus type safety.

 - Uniformity : 위에 코드 참조

 - type safety : Component가 유일한 구조 ( 전체 코드 참조[BOM package] )

 

[전체코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/CompositePattern

 

728x90

'Theory > Design Pattern' 카테고리의 다른 글

Facade Pattern  (0) 2022.05.09
Decorator Pattern  (0) 2022.05.08
Proxy Pattern  (0) 2022.04.24
Bridge Pattern  (0) 2022.04.24
Prototype Pattern  (0) 2022.04.23

댓글