Java 디자인 모드의 조합 모드(Composite 모드) 소개

Composite 정의: 객체를 트리 구조로 구성하여'부분-전체'의 차원 구조를 달성하여 클라이언트가 단일 객체와 조합 객체의 사용에 일치성을 가지도록 합니다.
Composite는 이해하기 쉬우므로 Composite를 생각하면 나무 구조도를 생각해야 한다.조합체 내의 이 대상들은 모두 공통된 인터페이스를 가지고 있으며, 조합체의 한 대상의 방법이 호출되어 실행될 때,Composite는 전체 트리 구조를 두루 돌아다니며 이 방법을 포함하는 대상을 찾아 호출 실행을 실현한다.견동백으로 형용할 수 있다.
그래서 Composite 모드는 Iterator 모드에 사용되고 Chain of Responsibility 모드와 유사합니다.
Composite 이점:
1. 클라이언트의 호출을 간단하게 하고 클라이언트가 조합 구조나 그 중의 단일 대상을 일치하게 사용할 수 있게 하면 사용자는 자신이 처리한 단일 대상인지 전체 조합 구조인지에 관계할 필요가 없다. 그러면 클라이언트 코드를 간소화할 수 있다.
2. 조합체에 대상 부품을 넣기 쉽다.클라이언트는 새 대상 부품이 추가되었다고 코드를 변경할 필요가 없습니다.
Composite 사용 방법
먼저 하나의 인터페이스나 추상적인 종류를 정의한다. 이것은 디자인 모델의 일반적인 방식이다. 다른 디자인 모델은 인터페이스 내부에 대한 정의에 제한이 많지 않다. Composite는 인터페이스 내부에 Composite 조합체에 접근하고 관리하는 대상(또는 부품 Component)을 정의하는 규정이 있다.
다음 코드는 추상적인 클래스로 정의되어 있으며, 일반적으로 인터페이스 인터페이스를 최대한 사용합니다.

public abstract class Equipment{
 private String name;
 //
 public abstract double netPrice();
 //
 public abstract double discountPrice();
 //   
 public boolean add(Equipment equipment) { return false; }
 //
 public boolean remove(Equipment equipment) { return false; }
 // , 。
 public Iterator iter() { return null; }
 public Equipment(final String name) { this.name=name; }
}
추상적인 클래스 Equipment는 바로 Component 정의로 조합체 클래스의 대상들을 대표하고 Equipment에서 몇 가지 공통된 방법을 정의한다.

public class Disk extends Equipment{
 public Disk(String name) { super(name); }
 // Disk 1
 public double netPrice() { return 1.; }
 // disk 0.5 。
 public double discountPrice() { return .5; }
}
Disk는 단일 요소(Primitive)를 구성하는 개체 또는 부품입니다.
또 하나는 부품도 하나의 조합체일 수도 있다. 즉, 이 부품 아래에'아들'이 있다는 것이다. 이것은 나무 구조에서 통상적인 상황으로 비교적 이해하기 쉽다.이제 우리는 이 조합체를 정의해야 한다.

abstract class CompositeEquipment extends Equipment{
 private int i=0;
 // Vector ' '
 private Lsit equipment=new ArrayList();
 public CompositeEquipment(String name) { super(name); }
 public boolean add(Equipment equipment) {
  this.equipment.add(equipment);
  return true;
 }
 public double netPrice(){
  double netPrice=0.;
  Iterator iter=equipment.iterator();
  for(iter.hasNext())
   netPrice+=((Equipment)iter.next()).netPrice();
  return netPrice;
 }
 public double discountPrice(){
  double discountPrice=0.;
  Iterator iter=equipment.iterator();
  for(iter.hasNext())
   discountPrice+=((Equipment)iter.next()).discountPrice();
  return discountPrice;
 }
 // , 。
 // dIsk , Disk (Primitive) .
 public Iterator iter(){
  return equipment.iterator() ;
    }
    // Iterator
 public boolean hasNext() { return i<equipment.size(); }
 // Iterator
 public Object next(){
  if(hasNext())
   return equipment.elementAt(i++);
  else
     throw new NoSuchElementException();
 }
}
위의 Composite Equipment는 Equipment를 계승하고 자신의 대상들에게 외부 접근 방법을 제공하여 Iterator를 다시 불러왔습니다. Iterator는 Java의 Collection의 인터페이스이고 Iterator 모델의 실현입니다.
Composite Equipment의 두 가지 구체적인 종류를 살펴보자. 케이스 Chassis와 상자 Cabinet, 상자 안에 많은 물건을 넣을 수 있다. 예를 들어 바닥판, 전원 케이스, 하드디스크 케이스 등이다.케이스 안에 하드디스크 플로피 드라이브 등 작은 설비를 넣을 수 있다.의심할 여지없이 이 두 가지는 모두 조합체 성질에 속한다.

public class Chassis extends CompositeEquipment{
 public Chassis(String name) { super(name); }
 public double netPrice() { return 1.+super.netPrice(); }
 public double discountPrice() { return .5+super.discountPrice(); }
}

public class Cabinet extends CompositeEquipment{
 public Cabinet(String name) { super(name); }
 public double netPrice() { return 1.+super.netPrice(); }
 public double discountPrice() { return .5+super.discountPrice(); }
}

이로써 우리는 전체 Composite 모델의 구조를 완성했다.
클라이언트가 Composote 코드를 호출하는 것을 볼 수 있습니다.

Cabinet cabinet=new Cabinet("Tower");

Chassis chassis=new Chassis("PC Chassis");
// PC Chassis Tower ( )
cabinet.add(chassis);
// 10GB PC Chassis ( )
chassis.add(new Disk("10 GB"));

// netPrice() ;
System.out.println("netPrice="+cabinet.netPrice());
System.out.println("discountPrice="+cabinet.discountPrice());

위에서 호출한 방법인netPrice () 또는discountPrice (), 실제로Composite는 Iterator를 사용하여 전체 트리 구조를 훑어보고 이 방법을 포함하는 대상을 찾아 호출 실행을 실현합니다.
Composite는 지혜를 교묘하게 나타내는 모델로 실제 응용에서 나무 구조에 부딪히면 이 모델을 사용할 수 있는지 시험해 볼 수 있다.
포럼을 예로 들면 한 판(forum)에 많은 댓글(message)이 있는데 이런 댓글은 원시 스티커가 있고 원시 스티커에 대한 응답 스티커가 있는데 전형적인 나무 구조이다. 그러면 당연히 Composite 모델을 사용할 수 있다. 그러면 우리는 Jive에 들어가 어떻게 실현되었는지 살펴보자.
Jive 해부
Jive에서 ForumThread는 ForumMessages의 컨테이너 (조합체) 입니다.즉, ForumThread는 우리의 이전 Composite Equipment와 유사합니다.메시지와의 관계는 다음과 같습니다.

[thread]
   |- [message]
   |- [message]
      |- [message]
      |- [message]
         |- [message]
ForumThread에서 다음 코드를 볼 수 있습니다.

public interface ForumThread {
 ....
 public void addMessage(ForumMessage parentMessage, ForumMessage newMessage)
   throws UnauthorizedException;
 public void deleteMessage(ForumMessage message)
   throws UnauthorizedException;
 public Iterator messages();
 ....
}
Composite Equipment와 유사하게 자신의 조합체에 접근하는 위젯 방법을 제공합니다. 추가, 삭제, 반복.
나의 다른 모델에서 Jive에 대한 분석을 결합하면 우리는 Jive 포럼 체계의 구조를 대체적으로 이해했다. 만약에 당신이 디자인 모델을 이해하지 않고 Jive 원본 코드를 직접 보면 이해할 수 없을 것이다.

좋은 웹페이지 즐겨찾기