Composite Pattern

윤세영·2023년 7월 6일
0

DesignPattern

목록 보기
4/15

정의

  • Object group이 단일 object와 동일하게 다루는 것이다.
  • client들이 단일 object와 복합체(composition)들을 동일하게 다룬다.

용도

  • Client가 object들의 composition과 단일 object 사이 차이를 무시해야 할 때 사용한다.
  • 여러 개의 object들을 같은 방법으로 사용하거나,
    그 object들에게 비슷한 코드를 사용한다면 composite pattern을 생각해 볼 수 있다.

구조

  • Composite
    • 자식들을 다루는 메소드로 일반적으로 자식들에게 기능을 위임하여 component의 모든 method를 구현한다.
  • Component
    • composite 하나를 포함하는, 자신을 포함한 모든 component들의 추상화로 composite에서 object들을 위한 interface를 제공한다.
    • 또한 선택적으로 component의 부모에 접근하기 위해 recursive structure의 interface를 구현하기도 한다.
  • 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

profile
Frontend

0개의 댓글