C\#디자인 모델 시리즈 튜 토리 얼-조합 모델

1.개술
대상 을 트 리 구조 로 조합 하여'부분-전체'의 차원 구 조 를 나타 낸다.조합 모드 는 사용자 로 하여 금 하나의 대상 과 조합 대상 에 대한 사용 이 일치 성 을 가지 게 한다.
2.해결 하 는 문제
하나의 대상 과 조합 대상 의 차 이 를 무시 하고 조합 구조 중의 모든 대상 을 통일 적 으로 사용 하 기 를 원한 다(이러한'통일'성 을 패키지 합 니 다).
3.조합 모드 의 캐릭터
3.1 조합 위 젯(Component):추상 적 인 역할 로 조합 할 대상 에 게 통 일 된 인 터 페 이 스 를 제공 합 니 다.
3.2 잎(Leaf):조합 에서 서브 노드 의 대상 을 나타 내 고 잎 노드 에 서브 노드 가 있 으 면 안 된다.
3.3 합성 위 젯(Composite):지엽 적 인 행동 을 정의 하여 위 젯 을 저장 하고 Component 인터페이스 에서 의 관련 작업 을 실현 합 니 다.예 를 들 어 추가(Add)와 삭제(Remove).
4.패턴 판독
4.1 조합 모델 의 유형 도
//img.jbzj.com/file_images/article/201606/2016060111022323.png
4.2 조합 모델 의 실현 코드

  /// <summary>
  ///       ,             Component    
  /// </summary>
  public abstract class Component
  {
    protected string name;

    public Component(string name)
    {
      this.name = name;
    }

    /// <summary>
    ///       
    /// </summary>
    /// <param name="component"></param>
    public abstract void Add(Component component);

    /// <summary>
    ///       
    /// </summary>
    /// <param name="component"></param>
    public abstract void Remove(Component component);

    /// <summary>
    ///       
    /// </summary>
    public abstract void Display(int level);
  }

  /// <summary>
  ///     
  /// </summary>
  public class Leaf : Component
  {
    public Leaf(string name)
      : base(name)
    { }

    /// <summary>
    ///            ,  Add Remove          ,     Component,                        ,           。
    /// </summary>
    /// <param name="component"></param>
    public override void Add(Component component)
    {
      Console.WriteLine("Can not add a component to a leaf.");
    }

    /// <summary>
    ///        ,              
    /// </summary>
    /// <param name="component"></param>
    public override void Remove(Component component)
    {
      Console.WriteLine("Can not remove a component to a leaf.");
    }

    public override void Display(int level)
    {
      Console.WriteLine(new string('-',level) + name);
    }
  }

  /// <summary>
  ///          ,      ,   Component            
  /// </summary>
  public class Composite : Component
  {
    public Composite(string name)
      : base(name)
    { }

    /// <summary>
    ///        ,               
    /// </summary>
    private List<Component> children = new List<Component>();

    /// <summary>
    ///      
    /// </summary>
    /// <param name="component"></param>
    public override void Add(Component component)
    {
      children.Add(component);
    }

    /// <summary>
    ///      
    /// </summary>
    /// <param name="component"></param>
    public override void Remove(Component component)
    {
      children.Remove(component);
    }

    public override void Display(int level)
    {
      Console.WriteLine(new string('-', level) + name);

      //          
      foreach (Component component in children)
      {
        component.Display(level+2);
      }
    }
  }

4.3 클 라 이언 트 코드

  class Program
  {
    static void Main(string[] args)
    {
      //     ,           
      Component root = new Composite("Root");
      root.Add(new Leaf("Leaf A in Root"));
      root.Add(new Leaf("Leaf B in Root"));

      //          
      Component branchX = new Composite("Branch X in Root");
      Component branchY = new Composite("Branch Y in Root");
      root.Add(branchX);
      root.Add(branchY);

      //  BranchX     
      branchX.Add(new Leaf("Leaf A in Branch X"));

      //  BranchX     
      Component branchZ = new Composite("Branch Z in Branch X");
      branchX.Add(branchZ);

      //  BranchY     
      branchY.Add(new Leaf("Leaf in Branch Y"));

      //  BranchZ     
      branchZ.Add(new Leaf("Leaf in Branch Z"));

      //    
      root.Display(1);

      Console.Read();
    }
  }

실행 결과
//img.jbzj.com/file_images/article/201606/2016060111022324.png
5.투명 방식 과 보안 방식
5.1 투명 방식:Component 에서 하위 대상 을 관리 하 는 모든 방법 을 설명 합 니 다.그 중에서 Add,Remove 등 을 포함 합 니 다.이렇게 Component 인 터 페 이 스 를 실현 하 는 모든 하위 클래스 는 Add 와 Remove 방법 을 갖 추고 있다.이렇게 하 는 장점 은 잎 노드 와 가지 점 이 외부 에 차이 가 없고 완전히 일치 하 는 인 터 페 이 스 를 갖 추고 있다 는 것 이다.
5.2 보안 방식:Component 에서 Add 와 Remove 방법 을 설명 하지 않 으 면 하위 클래스 의 Leaf 는 이 를 실현 하지 않 고 Composit 에서 하위 클래스 대상 을 관리 하 는 모든 방법 을 설명 합 니 다.
5.3 두 가지 방식 은 단점 이 있다.투명 한 방식 에 대해 클 라 이언 트 가 잎 노드 와 가지 점 이 일치 하지만 잎 노드 는 Add 와 Remove 기능 을 가지 지 않 기 때문에 그들의 실현 에 의미 가 없다.안전 방식 에 있어 잎 노드 는 Add 와 Remove 와 같은 방법 을 실현 할 필요 가 없 지만 클 라 이언 트 에 게 잎 노드 와 가지 점 을 판정 하여 클 라 이언 트 의 사용 에 불편 을 가 져 다 주어 야 한다.
6.모델 총화
6.1 장점
6.1.1 클 라 이언 트 호출 을 간단하게 하고 조합 구조 나 그 중의 단일 대상 을 일치 하 게 사용 하여 클 라 이언 트 코드 를 간소화 할 수 있다.
6.1.2 조합 체 내 에 대상 부품 을 추가 하기 쉽다.클 라 이언 트 는 새로운 위 젯 에 가입 했다 고 해서 코드 를 변경 할 필요 가 없습니다.기능 확장 에 유리 하 다.
6.2 단점
6.2.1 투명 한 방식 을 사용 할 지 안전 한 방식 을 선택해 야 한다.
6.2.2 투명 방식 은 대상 을 대상 으로 하 는 단일 직책 원칙 에 위배 된다.안전 방식 은 고객 이 판정 해 야 할 부담 을 증가 시 켰 다.
6.3 적용 필드
6.3.1 대상 의 부분-전체적인 차원 구 조 를 표현 하고 자 할 때
6.3.3 사용자 가 조합 대상 과 하나의 대상 이 다 르 기 를 무시 하고 사용자 가 조합 구조의 모든 대상 을 통일 적 으로 사용 할 때.

좋은 웹페이지 즐겨찾기