Composite Pattern (컴포지트 패턴)
Composite Pattern
정의
Object group이 단일 object와 동일하게 다루는 것이다.
client들이 단일 object와 복합체(composition)들을 동일하게 다룬다.
용도
Client가 object들의 composition과 단일 object 사이 차이를 무시해야 할 때 사용한다.
여러 개의 object들을 같은 방법으로 사용하거나,
그 object들에게 비슷한 코드를 사용한다면 composite pattern을 생각해 볼 수 있다.
구조
1. Composite
자식들을 다루는 메소드로 일반적으로 자식들에게 기능을 위임하여 component의 모든 method를 구현한다.
2. Component
composite 하나를 포함하는, 자신을 포함한 모든 component들의 추상화로 composite에서 object들을 위한 interface를 제공한다.
또한 선택적으로 component의 부모에 접근하기 위해 recursive structure의 interface를 구현하기도 한다.
3. Leaf
composition에서 leaf 객체들을 나타내며, component의 모든 method들을 구현한다.
소스코드
Component
package CompositePattern;
public interface Component {
public void show();
}
composite
package CompositePattern;
import java.util.ArrayList;
import java.util.List;
public class Composite implements Component {
private List<Component> childComponents = new ArrayList<Component>();
public void add(Component component){
childComponents.add(component);
}
public void remove(Component component){
childComponents.remove(component);
}
@Override
public void show() {
childComponents.forEach(Component::show);
}
}
Leaf
package CompositePattern;
public class Leaf implements Component {
private String name;
public Leaf(String name){
this.name=name;
}
@Override
public void show() {
System.out.println(name);
}
}
main
package CompositePattern;
public class Main {
public static void main(String[] args){
Leaf leaf1 = new Leaf("leaf 1");
Leaf leaf2 = new Leaf("leaf 2");
Leaf leaf3 = new Leaf("leaf 3");
Composite composite1 = new Composite();
composite1.add(leaf1);
Composite composite2 = new Composite();
composite2.add(leaf2);
composite2.add(leaf3);
composite1.add(composite2);
composite1.show();
System.out.println("remove 1");
composite1.remove(leaf1);
composite1.show();
System.out.println("remove composite 2");
composite1.remove(composite2);
composite1.show();
System.out.println("print composite 2");
composite2.show();
}
}
결과화면
UML
'SW > DesignPattern' 카테고리의 다른 글
Proxy Pattern (프록시 패턴) (0) | 2017.09.18 |
---|---|
State Pattern (스테이트 패턴) (0) | 2017.09.15 |
Iterator Pattern (반복자 패턴) (0) | 2017.09.14 |
Template Method Pattern (템플릿메소드패턴) (0) | 2017.09.11 |
Facade Pattern (퍼사드 패턴) (0) | 2017.09.07 |