반응형

Design Patterns - Composite Pattern


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

합성(composite) 패턴은 단일 객체로써 유사한 방법으로 객체의 그룹을 다룰 필요가 있는 곳에서 사용된다. 합성 패턴은 전테적인 수직구조 만큼 잘 부분을 표현하기 위해 트리구조의 관점에서 객체를 합성한다. 이 디자인 패턴의 형태는 이 패턴이 객체 그룹의 트리구조를 생성하기 때문에 구조적 패턴에 포함된다.
이 패턴은 자신의 객체의 그룹을 포함하는 클래스를 생성한다. 이 클래스는 동일 객체의 그룹을 수정하기 위한 방법을 제공한다.
조직의 고용인 수직구조를 보여줄 예제를 통해 합성패턴의 사용법을 보여줄 것이다.

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 ]


반응형

+ Recent posts