[구조 패턴] Composite pattern (컴포지트 패턴)


클라이언트에서 객체 컬렉션과 개발 객체를 똑같이 다룰 수 있도록 한다.

클래스 내에서 자기와 동일한 종류의 클래스들을 포함해야 할 때.

 

(원문 위치 : http://www.tutorialspoint.com/design_pattern/composite_pattern.htm )

 

합성 패턴은 단일 객체와 유사한 방식으로 객체 그룹을 처리해야하는 경우에 사용됩니다. 복합 패턴은 전체 계층뿐만 아니라 부분을 표현하기 위해 트리 구조의 용어로 객체를 작성합니다. 이 패턴은 객체 그룹의 트리 구조를 생성하기 때문에 구조적 패턴에 속합니다.

이 패턴은 자체 객체의 그룹을 포함하는 클래스를 만듭니다. 이 클래스는 동일한 객체 그룹을 수정하는 방법을 제공합니다.

우리는 조직의 직원 계층 구조를 보여주는 다음 예제를 통해 복합 패턴의 사용을 시연합니다.
 

 

Implementation

합성 패턴 동작자(composite pattern actor) 클래스로써 동작하는 Employee 클래스가 있다. CompositePatternDemo, demo 클래스는 부서 레벨 수직구조를 추가하고 모든 고용인을 출력하기 위해 Employee 클래스를 사용할 것이다.

Composite Pattern UML Diagram

Step 1

Employee 객체의 목록을 갖는 Employee 클래스를 생성한다.

Employee.java

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

public class Employee {
   private String name;
   private String dept;
   private int salary;
   private List<Employee> subordinates;

   // constructor
   public Employee(String name,String dept, int sal) {
      this.name = name;
      this.dept = dept;
      this.salary = sal;
      subordinates = new ArrayList<Employee>();
   }

   public void add(Employee e) {
      subordinates.add(e);
   }

   public void remove(Employee e) {
      subordinates.remove(e);
   }

   public List<Employee> getSubordinates(){
     return subordinates;
   }

   public String toString(){
      return ("Employee :[ Name : " + name + ", dept : " + dept + ", salary :" + salary+" ]");
   }   
}

Step 2

employee 수직구조를 생성하고, 출력하기 위해 Employee 클래스를 사용한다.

CompositePatternDemo.java

public class CompositePatternDemo {
   public static void main(String[] args) {
   
      Employee CEO = new Employee("John","CEO", 30000);

      Employee headSales = new Employee("Robert","Head Sales", 20000);

      Employee headMarketing = new Employee("Michel","Head Marketing", 20000);

      Employee clerk1 = new Employee("Laura","Marketing", 10000);
      Employee clerk2 = new Employee("Bob","Marketing", 10000);

      Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
      Employee salesExecutive2 = new Employee("Rob","Sales", 10000);

      CEO.add(headSales);
      CEO.add(headMarketing);

      headSales.add(salesExecutive1);
      headSales.add(salesExecutive2);

      headMarketing.add(clerk1);
      headMarketing.add(clerk2);

      //print all employees of the organization
      System.out.println(CEO); 
      
      for (Employee headEmployee : CEO.getSubordinates()) {
         System.out.println(headEmployee);
         
         for (Employee employee : headEmployee.getSubordinates()) {
            System.out.println(employee);
         }
      }		
   }
}

Step 3

결과를 확인한다.

Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]


 

Posted by kunoo
,