복합 정의 : 트리 구조에서 객체를 구성하여 "부분적인"계층 구조를 달성하여 클라이언트가 개별 객체와 결합 된 객체를 일관되게 사용하도록합니다.
합성물을 이해하기가 더 쉽습니다. 구성 본체의 이러한 객체는 공통된 인터페이스를 가지고 있습니다. 구성 본문의 객체의 방법이 호출되고 실행되면 복합재는 전체 트리 구조 (반복자)를 가로 지르고이 방법을 포함하는 객체를 찾아 통화 실행을 구현합니다. 그것은 백의 움직임을 당기는 것으로 설명 될 수 있습니다.
따라서 복합 모드는 반복 모드를 사용하며, 이는 책임 체인 모드와 유사합니다.
복합 혜택 :
1. 클라이언트를 간단하게 만들고 클라이언트는 조합 구조 또는 단일 객체를 일관된 방식으로 사용할 수 있습니다. 암호.
2. 객체 부품을 조합 본체에 추가하는 것이 더 쉽습니다. 클라이언트는 새로운 객체 구성 요소를 추가했기 때문에 코드를 변경할 필요가 없습니다.
복합재 사용 방법
먼저 인터페이스 또는 초록 클래스를 정의하십시오. 다른 디자인 패턴은 인터페이스의 내부 정의에 많은 제한이 없습니다. 복합 구성 (또는 구성 요소 구성 요소).
다음 코드는 추상 클래스로 정의되며 일반적으로 인터페이스를 가능한 한 많이 사용하려고합니다.
코드 사본은 다음과 같습니다.
공개 초록 수업 장비 {
개인 문자열 이름;
// 인터넷 가격
공개 초록 이중 NetPrice ();
// 할인 가격
공개 추상 Double DiscountPrice ();
// 부품 추가 방법
공개 부울 추가 (장비 장비) {return false}
// 부품 메소드를 삭제합니다
공개 부울 제거 (장비 장비) {return false}
// 여기서, 여기에 구성 요소 클래스에 액세스하는 방법이 있습니다.
public iterator iter () {return null}
공공 장비 (최종 문자열 이름) {this.name = 이름}
}
추상 클래스 장비는 컴포지트 클래스의 객체를 나타내는 구성 요소의 정의이며 장비에 몇 가지 공통 방법이 정의됩니다.
코드 사본은 다음과 같습니다.
공공 클래스 디스크 확장 장비 {
공개 디스크 (문자열 이름) {super (이름);
// 디스크 네트워크 가격을 1로 정의합니다
공개 이중 NETPRICE () {return 1.}
// 디스크 할인 가격은 0.5% 할인입니다.
Public Double DiscountPrice () {return .5;
}
디스크는 단일 요소 (원시) 인 조합 본체의 물체 또는 구성 요소입니다.
또 다른 가능성은 구성 요소가 조합, 즉이 구성 요소 아래에 '아들'이라는 것입니다. 이제이 조합을 정의해야합니다.
코드 사본은 다음과 같습니다.
초록 클래스 CompositeEquipment 확장 장비 {
개인 int i = 0;
// '아들'을 저장할 벡터 정의
개인 LSIT 장비 = New ArrayList ();
공개 CompositeEquipment (문자열 이름) {Super (이름);
공개 부울 추가 (장비 장비) {
this.equipment.add (장비);
진실을 반환하십시오.
}
공개 이중 netprice () {
Double NetPrice = 0.;
Ierator iter = 장비.iterator ();
for (iter.hasnext ())
netPrice+= ((장비) iter.next ()). netPrice ();
순 가격을 반환합니다.
}
public double discountprice () {
Double DiscountPrice = 0.;
Ierator iter = 장비.iterator ();
for (iter.hasnext ())
할인 프라이스+= ((장비) iter.next ()). 할인 프리즈 ();
반환 할인 - 리턴;
}
// 여기, 여기에, 여기에 자신의 조합으로 구성 요소에 액세스하는 방법이 있습니다.
// 위의 디스크가 존재하지 않는 이유는 디스크가 단일 요소이기 때문입니다.
공개 반복자 iter () {
return emperial.iterator ();
}
// 반복자 메소드를 과부하합니다
public boolean hasnext () {return i <Equipment.size ();
// 반복자 메소드를 과부하합니다
공개 대상 다음 () {
if (hasnext ())
반환 장비. Elementat (i ++);
또 다른
새로운 nosuchelementexception ()을 던지십시오.
}
}
위의 CompositeEquipment는 장비를 상속하고 내부의 객체에 대한 외부 액세스 방법을 제공하여 반복자를 과부하시킵니다.
CompositeEquipment의 두 가지 범주를 살펴 보겠습니다. 디스크 박스 섀시 및 박스 캐비닛에는베이스 플레이트, 파워 박스, 하드 디스크 박스 등이 있습니다 하드 디스크 플로피 드라이브 등과 같은 상자 등 의심 할 여지없이,이 두 가지 모두 조합입니다.
코드 사본은 다음과 같습니다.
공개 클래스 섀시는 CompositeEquipment를 확장합니다.
공개 섀시 (문자열 이름) {super (name)};
Public Double NetPrice () {return 1.+super.netprice ();
public double discountprice () {return .5+super.discountprice ();
}
공공 클래스 캐비닛은 CompositeEquipment 확장 {
공개 캐비닛 (문자열 이름) {super (이름);
Public Double NetPrice () {return 1.+super.netprice ();
public double discountprice () {return .5+super.discountprice ();
}
지금까지 우리는 전체 복합 모델의 아키텍처를 완료했습니다.
클라이언트 호출 Compose의 코드를 볼 수 있습니다.
코드 사본은 다음과 같습니다.
캐비닛 캐비닛 = 새 캐비닛 ( "타워");
섀시 섀시 = 새로운 섀시 ( "PC 섀시");
// PC 섀시를 타워에 삽입 (디스크를 상자에 포장)
캐비닛 .add (섀시);
// PC 섀시에 10GB 하드 드라이브를 삽입합니다 (하드 드라이브를 디스크 상자에 설치)
chassis.add (새 디스크 ( "10GB"));
// netPrice () 메소드를 호출;
System.out.println ( "netPrice ="+cabinet.netprice ());
System.out.println ( "discountprice ="+cabinet.discountprice ());
위의 메소드는 NetPrice () 또는 DiscountPrice ()입니다. Composite는 ITERATOR를 사용하여 전체 트리 구조를 가로 지르고이 방법을 포함하는 개체를 찾고 호출 실행을 구현합니다.
복합은 실제 응용 분야에서 지혜를 구현하는 매우 영리한 모델입니다.
포럼을 예로 들어 보면 버전 (포럼)에는 원래 게시물이 있습니다 , 우리는 Jive에 들어갑니다. 구현 방법을 살펴보십시오.
Jive 해부학
Jive에서 Forumthread는 Forum Messages의 컨테이너 컨테이너 (조합)입니다. 즉, Forumthread는 이전 예제의 CompositeEquipment와 유사합니다.
코드 사본은 다음과 같습니다.
[실]
|- [메시지]
|- [메시지]
|- [메시지]
|- [메시지]
|- [메시지]
Forumthread에서 다음 코드를 볼 수 있습니다.
코드 사본은 다음과 같습니다.
공개 인터페이스 포럼 스레드 {
.... ....
Public Void AddMessage (ForumMessage ParentMessage, ForumMessage NewMessage)
무단 예고를 던진다.
public void deletemessage (Forummessage 메시지)
무단 예고를 던진다.
공개 반복자 메시지 ();
.... ....
}
CompositeEquipment와 유사하게 자체 조합 본문에서 구성 요소에 액세스하는 방법 (추가, 삭제 및 트래버기)을 제공합니다.
다른 모델에서 Jive에 대한 나의 분석을 기반으로, 우리는 기본적으로 Jive 포럼 시스템의 프레임 워크를 이해하지 못하고 Jive 소스 코드를 보았다면 확실히 이해할 수 없습니다. .