Java 디자인 모드(8) 콤보 모드(Composite 모드)

15541 단어 java 디자인 모드
Composite 정의: 대상을 트리 구조로 구성하여'부분-전체'의 차원 구조를 달성하고 클라이언트가 단일 대상과 조합 대상의 사용에 일치성을 가지도록 한다.Composite는 이해하기 쉬우므로 Composite를 생각하면 트리 구조도를 생각해야 한다.그룹 내의 이 대상들은 모두 공통된 인터페이스를 가지고 있으며, 조합체의 한 대상의 방법이 호출되어 실행될 때,Composite는 전체 트리 구조를 옮겨다니며, 이 방법을 포함하는 대상을 찾아 호출 실행을 실현한다.견동백으로 형용할 수 있다.그래서 Composite 모드는 Iterator 모드에 사용되며Chain of Responsibility 모드와 유사합니다.Composite의 이점:
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 모드)

    좋은 웹페이지 즐겨찾기