상세 컨텐츠

본문 제목

Composite Pattern 배워보기

Java

by techbard 2014. 1. 16. 14:33

본문

반응형

컴포지트 패턴을 익혀서 기억에 계속 남기고자 끄적여 본다.

 

먼저 인터페이스를 이용한 구현을 소개한다.

 

클래스 다이어그램은 다음과 같다. 역시나 eUML2 플러그 인으로 뽑아낸 것.

 

 

1. 최상위 인터페이스를 생성한다. 모든 클래스가 이를 구현할 것이다.

 

IInterface.java

 

public interface IInterface {
 public void printMethod();
}

 

2. 이 인터페이스를 구현하는 AClass, BClass를 만들자.

 

public class AClass implements IInterface {

 @Override
 public void printMethod() {
  System.out.println("AClass");
 }
}

 

public class BClass implements IInterface {

 @Override
 public void printMethod() {
  System.out.println("BClass");
 }
}

 

3. 컨테이너 역할을 하는 컨테이너 클래스를 만들자.

 

이때, 컨테이너 자체와 컨테이너 이외의 자식 클래스 들을 담기 위해서 ArrayList<IInterface>를 멤버에 선언한다. 또한, 멤버에 있는 객체들을 추가하고 삭제하기 위한 별도의 메소드를 구현한다. 또, 재귀적으로 처리를 가능하도록 하기위해 실제 실행하고자 하는 메소드 이름과 동일한 메소드 이름을 만들고 그 구현을 ArrayList에서 하나씩 꺼내 다시 그 메소드 이름을 호출하도록 한다. (잉?)

 

import java.util.ArrayList;

public class ContainerClass implements IInterface {

 ArrayList<IInterface> container = new ArrayList<IInterface>();

 @Override
 public void printMethod() {
  for (IInterface c : container) {
   c.printMethod();
  }
 }
 
 public void add(IInterface i) {
  container.add(i);
 }
 
 public void remove(IInterface i){
  container.remove(i);
 }
}

 

4. 테스트 클래스를 작성한다.

 

 

public class ContainerClassTest {

 public static void main(String[] args) {
  AClass a1 = new AClass();
  AClass a2 = new AClass();
  AClass a3 = new AClass();
  
  BClass b1 = new BClass();
  
  ContainerClass c = new ContainerClass();
  ContainerClass c1 = new ContainerClass();
  ContainerClass c2 = new ContainerClass();
  
  c1.add(a1);
  c1.add(a2);
  c1.add(a3);
  
  c2.add(b1);
  
  c.add(c1);
  c.add(c2);
  
  c.printMethod();
 }
}

 

결과:

AClass
AClass
AClass
BClass

 

* 실제로 printMethod()를 호출한 곳은 24번 라인인데 결과를 보면 결국

a. a1.printMethod()가 실행되었다.

b. a2.printMethod()가 실행되었다.

c. a3.printMethod()가 실행되었다.

d. b1.printMethod()가 실행되었다.

 

5-9 라인에서 각각 클래스의 객체를 생성해 참조변수에 넣었고 다시 11번 라인에서는 최상위 컨테이너 c, 그다음 컨테이너 c1, c2를 생성했다.

 

15-17 라인에서는 c1 컨테이너에 a1, a2, a3를 담았고

19 라인에서는 c2 컨테이너에 b1을 담았다.

 

다시

21-22 라인에서 최상위 컨테이너 c에 c1 과 c2를 담았다.

 

결국

24번 라인이 실행되면 최상위 컨테이너 c 안에 담겨있던 객체들의 메소드가 순서대로 실행된다. (OOP의 폴리모피즘!)

 

이 과정을 트리로 나타내면 다음과 같다.

 

 

그냥 드는 생각은 이런거면 트리 자료구조 패턴이나, 컨테이너 패턴이라고 하지 왜 컴포짓 패턴일까?

 

 

CompositePattern.zip

 

반응형

관련글 더보기

댓글 영역