Java 디자인 모드(8) 콤보 모드(Composite 모드)
15541 단어 java 디자인 모드
4
4
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는 자바의 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의 용기container(조합체)입니다.즉,ForumThread는 우리가 상례에서의Composite Equipment와 유사하다는 것이다.메시지와의 관계는 다음과 같습니다. [thread] | - [메시지] | - [메시지] | - [메시지] | - [메시지] | - [메시지] | - [메시지]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 소스 코드를 직접 보면 이해할 수 없을 것이다.
기사 시리즈:
Java 설계 모드(1) 팩토리 모드(Factory 모드)
Java 디자인 모드(2) 단일 모드(Singleton 모드)
Java 디자인 모드(3) 작성자 모드(Builder 모드)
Java 디자인 모드(4) 원형 모드(Prototype 모드)
Java 디자인 모드(5) 공유 모드/향원 모드(Flyweight 모드)
Java 설계 모드(6) 브리지 모드(Bridge 모드)
Java 디자인 모드(7) 데코레이터 모드(Decorator 모드)
Java 디자인 모드(8) 콤보 모드(Composite 모드)
Java 설계 모드(9) 어댑터 모드(Adapter 모드)
Java 디자인 모드(10) 프록시 모드(Proxy 모드)
Java 디자인 모드(11) 모양새 모드(Facade 모드)
Java 디자인 모드(12) 교체 모드(Iterator 모드)
Java 디자인 모드(13) 템플릿 모드(Template 모드)
Java 디자인 모드(14) 책임 체인 모드(Chain of Responsibility 모드)
Java 설계 모드(15) 메모 모드(Memento 모드)
Java 디자인 모드(16) Mediator 모드)
Java 설계 모드(17) 해석기 모드(Interpreter 모드)
Java 설계 모드(18) 정책 모드(Strategy 모드)
Java 설계 모드(19) 상태 모드(State 모드)
Java 디자인 모드(20) 관찰자 모드(Observer 모드)
Java 디자인 모드(21) 액세스 모드(Visitor 사용자 모드)
Java 설계 모드(22) 명령 모드(Command 모드)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
어댑터(클래스 어댑터, 객체 어댑터 모드)1: 클래스 어댑터 모드 만일 우리가 Person류가 있다면, 이 Person류에는 불고 당기는 방법이 있다.시스템 개발의 절반에 이르러 우리는 이 종류에 두 가지 방법을 더 첨가하여 연주, 당기기, 연주, 노래의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.