안 드 로 이 드 의 건설 자 모델 을 깊이 이해 하 다.

머리말
안 드 로 이 드 개발 과정 에서 저 는 많은 안 드 로 이 드 코드 에서 디자인 모델 을 응용 한 것 을 발 견 했 습 니 다.어댑터 모델(각종 adapter),건설 자 모델(Alert Dialog 의 구축)등 이 있 습 니 다.비록 우 리 는 대부분의 디자인 모델 에 대해 알 고 있 지만 디자인 모델 을 응용 하 는 데 있어 많은 사람들 이 이 방면 에 부족 하 다 고 느낀다.그래서 이 글 은 안 드 로 이 드 의 창조 자 모델 을 깊이 이해 합 니 다.
작성 자 모드(Builder Pattern)는 생 성기 모드 라 고도 하 는데 그 정 의 는 다음 과 같다.
separate the construction of a complex object from its representation so that the same construction process can create different representations.복잡 한 대상 의 구축 과 표 시 를 분리 하면 같은 구축 과정 을 서로 다른 표현 으로 만 들 수 있다.
제 이해:하나의 제품(대상)표시(전시)와 구축(창설)과정 을 분리 하면 제품 의 구축 절차 가 같 지만 서로 다른 제품 표시 가 가능 하 다 는 것 입 니 다.
응용 장면
Android 에서 흔히 볼 수 있 는 예 를 들 어 보 겠 습 니 다.
안 드 로 이 드 의 AlertDialog 대화 상자 의 구축 과정 은 바로 건축 자 모델 의 전형 적 인 응용 이다.

빌 더 소스 한번 볼 게 요.

 public static class Builder {
  private final AlertController.AlertParams P;

  public Builder(Context context) {
    this(context, resolveDialogTheme(context, 0));
  }


  public Builder(Context context, int themeResId) {
    P = new AlertController.AlertParams(new ContextThemeWrapper(
        context, resolveDialogTheme(context, themeResId)));
  }

  //  set    
  setTitle()
  ...
  ...
  ...

  /**
   * Creates an {@link AlertDialog} with the arguments supplied to this
   * builder.
   * <p>
   * Calling this method does not display the dialog. If no additional
   * processing is needed, {@link #show()} may be called instead to both
   * create and display the dialog.
   */
  public AlertDialog create() {
    // Context has already been wrapped with the appropriate theme.
    final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
    P.apply(dialog.mAlert);
    dialog.setCancelable(P.mCancelable);
    if (P.mCancelable) {
      dialog.setCanceledOnTouchOutside(true);
    }
    dialog.setOnCancelListener(P.mOnCancelListener);
    dialog.setOnDismissListener(P.mOnDismissListener);
    if (P.mOnKeyListener != null) {
      dialog.setOnKeyListener(P.mOnKeyListener);
    }
    return dialog;
  }


  //   show   builder   ,     create() show()              
  public AlertDialog show() {
    final AlertDialog dialog = create();
    dialog.show();
    return dialog;
  }
}
원본 코드 를 분석 하면 내부 클래스Builder가 이 대화 상 자 를 구축 하 는 데 사 용 됩 니 다.
    1.builder을 만 들 때 이AlertController.AlertParams P;대상 P 를 new 로 만 듭 니 다.
    2.bilder에 각종 매개 변 수 를 설정 할 때 이 매개 변 수 는 모두 대상 P 에 존재 합 니 다.
    3.그리고builder매개 변 수 를 설정 한 후에 호출create방법 을 사용 합 니 다.

final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
P.apply(dialog.mAlert); // mAlert      
이 방법 은 먼저 외부 클래스AlertDialog의 구조 방법 을 호출 하고new외부 클래스 대상 을 추출 한 다음p.apply()방법 은 P 라 는 대상 을 내부 클래스 의 속성 할당AlertController대상mAlert에 게 부여 한다.이렇게 해서 한 번 의 구축 이 완성 되 었 다.
다음은 AlertDialog 부분 소스 입 니 다.

public class AlertDialog extends Dialog implements DialogInterface {
  //         builder        
  private AlertController mAlert;

  //                 builder   
  protected AlertDialog(Context context) {
    this(context, 0);
  }

  protected AlertDialog(Context context, boolean cancelable,   OnCancelListener cancelListener) {
    this(context, 0);
    setCancelable(cancelable);
    setOnCancelListener(cancelListener);
  }


  protected AlertDialog(Context context, @StyleRes int themeResId) {
    this(context, themeResId, true);
  }

  AlertDialog(Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
    super(context, createContextThemeWrapper ? resolveDialogTheme(context, themeResId) : 0,
      createContextThemeWrapper);

    mWindow.alwaysReadCloseOnTouchAttr();
    mAlert = new AlertController(getContext(), this, getWindow());
    }
}
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 안 드 로 이 드 개발 자 여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기