디자인 모델 시리즈 의 조합 모델 과 JDK 와 MyBatis 소스 코드 에서 의 활용 에 대한 상세 한 설명

조합 모델 과 JDK 소스 코드 에서 의 활용 프롤로그 조합 과 취 합 은 조합 모델 예제 투명 조합 모델 투명 조합 모델 의 결함 안전 조합 모델 조합 모델 캐릭터 조합 모델 이 JDK 소스 코드 에서 나타 난 조합 모델 응용 장면 향원 모델 의 장단 점 총 결 이다.
머리말
본 고 는 주로 조합 모델 의 용법 을 설명 하고 JDK 와 MyBatis 소스 코드 에서 의 활용 을 결합 하여 조합 모델 을 더욱 이해 할 것 이다.
인 코딩 원칙 중 하 나 는 조합 을 많이 사용 하고 계승 을 적 게 사용 하 는 것 이다.물론 이곳 의 조합 과 우리 가 오늘 말 하고 자 하 는 조합 모델 은 등가 가 아니다.이곳 의 조합 은 사실 일종 의 집합 이다.그러면 집합 과 조합 은 어떤 차이 가 있 습 니까?
조합 과 집합
사람 이 함께 있 으 면 무 리 를 부 르 고,마음 이 함께 있 으 면 팀 을 부른다.조합 과 집합의 차 이 를 이 말로 해석 하 는 것 은 상대 적 으로 적절 하 다.
취 합 이란 각 대상 이 모여 서 일 을 하 는 것 이지 만 나 는 너 없 이도 된다.나 는 여전히 정상적으로 운행 할 수 있다.그러나 조합 은 비교적 밀접 한 관 계 를 가진다.조합 중의 각 대상 간 에 하나의 전 체 를 구성 하고 특정한 대상 이 없 으 면 정상적으로 운행 하지 못 하거나 기능 에 큰 결함 이 있 을 수 있다.
집합 대상 은 같은 생명주기 가 없고,조합의 대상 은 같은 생명주기 가 있다 는 것 이다
예 를 들 어:
예 를 들 어 컴퓨터 와 USB 는 집합 이 고 컴퓨터 모니터 와 호스트 는 조합 이다.
조합 모드 가 뭐야?
조합 모드(Composite Pattern)는 전체-부분(Part-Whole)모드 라 고도 부른다.조합 모델 의 핵심 은 하나의 대상(잎 노드)과 조합 대상(나뭇가지 노드)을 같은 인터페이스 로 표시 함으로써 하나의 대상 과 조합 대상 의 사용 이 일치 하도록 하 는 것 이다.조합 모델 은 구조 형 모델 에 속한다.
조합 모델 은 일반적으로 전체 와 부분의 관 계 를 묘사 하 는데 대상 을 나무 구조 에 조직한다.맨 윗 층 의 노드 를 뿌리 노드 라 고 한다.뿌리 노드 아래 에는 나뭇가지 노드 와 잎 노드 가 포함 되 고 나뭇가지 노드 아래 에는 나뭇가지 노드 와 잎 노드 가 다음 과 같다.
在这里插入图片描述
이렇게 많은 이 야 기 를 했 는데 추상 적 인 느낌 이 들 어서 여전히 낡은 규칙 이다.Talk is cheap,Show you the code.
예시
조합 모드 는 투명 모드 와 안전 모드 두 가지 방법 이 있다.다음은 수 능 과목 을 예 로 들 어 조합 모델 이 코드 에 어떻게 나타 나 는 지 살 펴 보 겠 습 니 다.
투명 조합 모드
1.먼저 맨 위 에 있 는 추상 적 인 과목 류 를 만 듭 니 다.이런 유형 에서 세 가지 일반적인 조작 방법 을 정 의 했 지만 모두 기본 적 으로 조작 을 지원 하지 않 습 니 다.

package com.zwx.design.pattern.composite.transparency;

/**
 *       
 */
public abstract class GkAbstractCourse {
  public void addChild(GkAbstractCourse course){
    System.out.println("       ");
  }

  public String getName() throws Exception {
    throw new Exception("       ");
  }

  public void info() throws Exception{
    throw new Exception("         ");
  }
}
PS:이런 유형의 공공 방법 이 추상 적 인 방법 으로 정의 되 지 않 는 이 유 는 추상 적 인 방법 으로 정의 되면 모든 하위 클래스 가 부모 방법 을 다시 써 야 하기 때문에 차이 점 을 나타 내지 못 하기 때 문 입 니 다.이상 을 던 지 는 방식 으로 하위 클래스 에 필요 한 기능 이 있 으 면 부 류 를 덮어 쓰 는 방법 을 다시 쓰 면 된다.
2.일반 과목 류 를 새로 만 들 면 통용 과목 의 추상 류 를 계승 합 니 다.이 종 류 는 잎 노드 로 서 addChild 방법 을 다시 쓰 지 않 습 니 다.즉,이 종 류 는 잎 노드 에 속 하고 하위 노드 를 추가 하 는 것 을 지원 하지 않 습 니 다.

package com.zwx.design.pattern.composite.transparency;

/**
 *      (    )
 */
public class CommonCource extends GkAbstractCourse {
  private String name;//    
  private String score;//    

  public CommonCource(String name, String score) {
    this.name = name;
    this.score = score;
  }

  @Override
  public String getName(){
    return this.name;
  }

  @Override
  public void info() {
    System.out.println("  :" + this.name + ",  :" + score);
  }
}
3.등급 을 가 진 노드 를 만 들 고 세 가지 방법 을 모두 재 작성 했다.서브 노드 를 추가 하 는 것 을 지원 한다.이런 유형 에서 인쇄 를 편리 하 게 할 때 등급 관 계 를 알 수 있 기 때문에 저 는 등급 속성 을 정 의 했 습 니 다.

package com.zwx.design.pattern.composite.transparency;

import java.util.ArrayList;
import java.util.List;

/**
 *     
 */
public class LevelCource extends GkAbstractCourse{
  private List<GkAbstractCourse> courseList = new ArrayList<>();
  private String name;
  private int level;

  public LevelCource(String name, int level) {
    this.name = name;
    this.level = level;
  }

  @Override
  public void addChild(GkAbstractCourse course) {
    courseList.add(course);
  }

  @Override
  public String getName(){
    return this.name;
  }

  @Override
  public void info() throws Exception {
    System.out.println("  :" + this.name);
    for (GkAbstractCourse course : courseList){
      for (int i=0;i<level;i++){
        System.out.print(" ");
      }
      System.out.print(">");
      course.info();
    }
  }
}
4.테스트 클래스 를 만들어 서 테스트 합 니 다.

package com.zwx.design.pattern.composite.transparency;

public class TestTransparency {
  public static void main(String[] args) throws Exception {
    GkAbstractCourse ywCourse = new CommonCource("  ","150");
    GkAbstractCourse sxCourse = new CommonCource("  ","150");
    GkAbstractCourse yyCourse = new CommonCource("  ","150");

    GkAbstractCourse wlCourse = new CommonCource("  ","110");
    GkAbstractCourse hxCourse = new CommonCource("  ","100");
    GkAbstractCourse swCourse = new CommonCource("  ","90");

    GkAbstractCourse lzCourse = new LevelCource("  ",2);
    lzCourse.addChild(wlCourse);
    lzCourse.addChild(hxCourse);
    lzCourse.addChild(swCourse);

    GkAbstractCourse gkCourse = new LevelCource("      ",1);
    gkCourse.addChild(ywCourse);
    gkCourse.addChild(sxCourse);
    gkCourse.addChild(yyCourse);
    gkCourse.addChild(lzCourse);
    
    gkCourse.info();
  }
}
출력 결과:
과목:이과 수 능 과목
  >과목:국어,점수:150
  >과목:수학,점수:150
  >과목:영어,점수:150
  >과정:종합
    >과목:물리,점수:110
    >과정:화학,점수:100
    >과정:생물,점수:90
여기 서 일반 과목 으로 add 방법 을 호출 하면 이상 을 던 집 니 다.위 에서 호출 하면:

swCourse.addChild(ywCourse);
회 출력
추가 작업 은 지원 되 지 않 습 니 다
일반 과목 에 서 는 addChild 를 다시 쓰 는 방법 이 없 기 때문이다.
투명 조합 모드 의 결함
투명 모드 의 특징 은 조합 대상 의 모든 공공 방법 을 추상 적 인 구성 요소 에 정의 하 는 것 이다.이렇게 하 는 장점 은 클 라 이언 트 가 현재 대상 이 나뭇가지 노드 에 속 하 는 지 잎 노드 에 속 하 는 지 구분 할 필요 가 없다 는 것 이다.왜냐하면 그들 은 완전히 일치 하 는 인 터 페 이 스 를 가지 기 때문이다.그러나 단점 은 잎 노드 가 그 에 속 하지 않 는 방법 을 얻 었 다 는 것 이다.예 를 들 어 위의 addChild 방법 등 이다.이것 은 인터페이스 격 리 성 원칙 에 위배 된다.
안전 조합 모드
안전 조합 모델 은 시스템 각 차원 의 가장 기본 적 인 일치 성 행 위 를 규정 하고 조합(나무 노드)자체 의 방법(예 를 들 어 나뭇가지 노드 관리 서브 클래스 의 addChild 등 방법)을 자신 에 게 둔다.
1.먼저 꼭대기 층 의 추상 적 인 루트 노드 를 만 듭 니 다.(이 안 에는 일반적인 추상 적 인 info 방법 만 정의 되 어 있 습 니 다)

package com.zwx.design.pattern.composite.safe;

package com.zwx.design.pattern.composite.safe;

/**
 *       
 */
public abstract class GkAbstractCourse {
  protected String name;
  protected String score;

  public GkAbstractCourse(String name, String score) {
    this.name = name;
    this.score = score;
  }

  public abstract void info();
}
2.잎 노드 를 만 듭 니 다(여 기 는 info 방법 만 다시 썼 을 뿐 다른 특별한 방법 은 정의 되 지 않 았 습 니 다).

package com.zwx.design.pattern.composite.safe;

/**
 *     
 */
public class CommonCource extends GkAbstractCourse {

  public CommonCource(String name,String score) {
    super(name,score);
  }

  @Override
  public void info() {
    System.out.println("  :" + this.name + ",  :" + this.score);
  }
}
3.나뭇가지 노드 를 정의 합 니 다.

package com.zwx.design.pattern.composite.safe;

import java.util.ArrayList;
import java.util.List;

/**
 *     
 */
public class LevelCource extends GkAbstractCourse{
  private List<GkAbstractCourse> courseList = new ArrayList<>();
  private int level;

  public LevelCource(String name, String score,int level) {
    super(name,score);
    this.level = level;
  }

  public void addChild(GkAbstractCourse course) {
    courseList.add(course);
  }

  @Override
  public void info() {
    System.out.println("  :" + this.name + ",  :" + this.score);
    for (GkAbstractCourse course : courseList){
      for (int i=0;i<level;i++){
        System.out.print(" ");
      }
      System.out.print(">");
      course.info();
    }
  }
}
4.새로운 테스트 클래스 로 테스트:

package com.zwx.design.pattern.composite.safe;

public class TestSafe {
  public static void main(String[] args) throws Exception {
    CommonCource ywCourse = new CommonCource("  ","150");
    CommonCource sxCourse = new CommonCource("  ","150");
    CommonCource yyCourse = new CommonCource("  ","150");

    CommonCource wlCourse = new CommonCource("  ","110");
    CommonCource hxCourse = new CommonCource("  ","100");
    CommonCource swCourse = new CommonCource("  ","90");

    LevelCource lzCourse = new LevelCource("  ","300",2);
    lzCourse.addChild(wlCourse);
    lzCourse.addChild(hxCourse);
    lzCourse.addChild(swCourse);

    LevelCource gkCourse = new LevelCource("    ","750",1);
    gkCourse.addChild(ywCourse);
    gkCourse.addChild(sxCourse);
    gkCourse.addChild(yyCourse);

    gkCourse.addChild(lzCourse);
    gkCourse.info();
  }
}
출력 결 과 는:
과목:이과 수 능,점수:750
  >과목:국어,점수:150
  >과목:수학,점수:150
  >과목:영어,점수:150
  >과정:종합,점수:300
    >과목:물리,점수:110
    >과정:화학,점수:100
    >과정:생물,점수:90
투명 방식 과 달리 잎 노드 는 addChild 기능 을 갖 추 지 않 아 호출 할 수 없습니다.위의 예제 에 서 는 호출 될 수 있 지만 호출 된 후에 지원 되 지 않 습 니 다.이것 이 바로 이 두 가지 쓰기 의 가장 큰 차이 입 니 다.
조합 모드 캐릭터
위의 예제 에서 볼 수 있 듯 이 조합 모델 은 다음 과 같은 세 가지 역할 을 포함한다.
4.567917.추상 적 인 루트 노드(Component):시스템 각 차원 대상 의 공유 속성 과 방법 을 정의 하고 기본 적 인 행위 와 속성 을 미리 정의 할 수 있 습 니 다4.567917.나뭇가지 노드(Composite):나뭇가지 노드 의 행 위 를 정의 하고 서브 노드 를 저장 하 며 나뭇가지 노드 와 잎 노드 를 조합 하여 나무 구 조 를 형성한다4.567917.잎 노드(Leaf):시스템 이 층 차 를 옮 겨 다 니 는 가장 작은 단위 이 고 아래 에는 하위 노드 가 없다조합 모드 가 JDK 소스 코드 에서 의 구현
1、HashMap
HashMap 에 putAll 방법 이 있 는데 매개 변 수 는 Map 입 니 다.이것 이 바로 조합 모델 의 표현 입 니 다.
在这里插入图片描述
또한 Array List 의 addAll 방법 도 마찬가지다.
2.MyBatis 에는 SqlNode 인터페이스 가 있 고 다음 단계 의 태그 가 많 습 니 다.
在这里插入图片描述
그리고 1 급 라벨 아래 에 2 급 라벨 이 있 습 니 다.(이것 이 바로 조합 모델 의 표현 입 니 다)
在这里插入图片描述  
조합 모드 응용 장면
조합 모드 는 일반적으로 등급 관계 가 있 는 장면 에 응용 되 는데 가장 전형 적 인 것 은 트 리 메뉴,파일 과 폴 더 의 관리 등 이다.
향원 모드 장단 점
장점:차원 별 복잡 한 대상 을 명확 하 게 정의 하여 클 라 이언 트 가 차원 의 차 이 를 무시 하고 전체 차원 에 대해 동적 통 제 를 할 수 있 도록 한다.
단점:잎 과 나뭇가지 의 성명 은 인터페이스 가 아 닌 실현 류 로 후진 원칙 에 의존 하고 조합 모델 은 디자인 을 더욱 추상 적 이 고 이해 하기 어렵다.
총결산
본 고 는 주로 조합 모델 을 소개 하고 일반적인 집합 과 조합 간 의 차 이 를 소개 하 며 예 를 들 어 조합 모델 에서 의 투명 한 쓰기 와 안전 한 쓰기 의 차 이 를 상세 하 게 설명 했다.마지막 으로 JDK 와 MyBatis 소스 코드 에서 의 활용 을 결합 시 켜 조합 모델 의 활용 을 더욱 이해 했다.
저 를 지 켜 보 세 요.외 로 운 늑대 와 함께 공부 하 세 요.
여기 서 디자인 모델 시리즈 의 조합 모델 과 JDK 와 MyBatis 소스 코드 에서 의 활용 에 대한 상세 한 설명 을 소개 합 니 다.더 많은 관련 조합 모델 이 JDK 와 MyBatis 소스 코드 에서 의 활용 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 문장 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기