Android 에서 가장 자주 사용 하 는 디자인 모델 인 안 드 로 이 드 소스 분석 - 조합 모델 (component)

26492 단어 디자인 모드
의사 코드 는 다음 과 같 습 니 다:
public void testComponent(){
    Composite root = new Composite("  --   ");
Composite c1 = new Composite("  -----     1");
Composite c2 = new Composite("  -----     2");

Leaf leaf1 = new Leaf("  ------     1");
Leaf leaf2 = new Leaf("  ------     2");
Leaf leaf3 = new Leaf("  ------     3");
Leaf leaf4 = new Leaf("  ------     4");

root.addChild(c1);
root.addChild(c2);

c1.addChild(leaf1);
c1.addChild(leaf2);
c1.addChild(leaf3);
c1.addChild(leaf4);

c2.addChild(leaf1);
c2.addChild(leaf2);
c2.addChild(leaf3);
c2.addChild(leaf4);


//          
root.paycard("");
}
public class Composite implements IComponent {


    /**
     *                  
*/
private List childComponents = new ArrayList();
/**
     *        
*/
private String name;
/**
     * * @param name           
*/
public Composite(String name){
        this.name = name;
}
    /**
     * * @param child      
*/
public void addChild(IComponent child){
        childComponents.add(child);
}
    /**
     * * @param index         
*/
public void removeChild(int index){
        childComponents.remove(index);
}
    /**
     * */
public List getChild(){
        return childComponents;
}

    /**
     *          
* @param preStr   ,           ,      
*/
@Override
public void paycard(String preStr) {
        //       
System.out.println(preStr + "+" + this.name);
//if(this.childComponents != null){
            //preStr += "  ";
//          
for(IComponent c : childComponents){
                //         
c.paycard(preStr);
}
        }
    }
}
public class Leaf implements IComponent {

    /**
     *        
*/
private String name;
/**
     * * @param name        
*/
public Leaf(String name){
        this.name = name;
}
    /**
     *          ,         ,            
* @param preStr   ,            ,      
*/
@Override
public void paycard(String preStr) {
        // TODO Auto-generated method stub
System.out.println(preStr + "-" + name);
}

}
public interface IComponent {
    /**
     *          
*/
public void paycard(String preStr);

}

요약:
  • Component: 추상 적 인 노드 는 조합 중의 대상 에 게 인 터 페 이 스 를 설명 하고 적당 할 때 모든 유형의 공유 인터페이스 방법의 기본 행 위 를 실현 합 니 다.
  • Composite: 뿌리 노드 일 수 있 고 모든 줄기 노드 의 행 위 를 정의 할 수 있 으 며 하위 노드 를 저장 하고 노드 를 추가 하 며 노드 를 삭제 하여 관련 작업 을 실현 할 수 있다 (Component 계승).
  • Leaf: 잎 노드, 하위 노드 가 없고 관련 대상 의 행 위 를 실현 한다 (Component 계승).

  • 실례 와 장면 분석:
      그러면 우 리 는 우리 회원 카드 의 소비 에 따라 조합 모델 의 실현 을 모 의 해 봅 시다!let's go!
            우선:
                   1. 우리 의 부품 은 본점, 지점, 가맹 점 이 있 습 니 다!
                   2. 우리 의 부품 공유 행 위 는 회원 카드 를 긁 는 것 입 니 다.
                   3. 부품 간 의 차원 관계, 즉 가게 의 차원 관 계 는 본점 아래 에 지점, 지점 아래 에 가맹 점 을 가 질 수 있다 는 것 이다.
            우리 의 이 몇 가지 필요 한 조건 이 생 긴 후에 나의 요 구 는 바로 현재 가게 에서 행 사 를 하 는 것 이다. 내 가 본점 에서 카드 를 긁 은 후에 모든 하급 가게 에서 카드 를 긁 는 포인트 총액 을 누적 할 수 있다. 디자인 의 코드 는 다음 과 같다.
    이렇게 하면 모든 가게 의 면적 을 누적 할 때 가게 의 개수 에 관심 을 가 질 필요 가 없다. 잎 노드 든 조합 노드 든 관계 가 없다. 즉, 본점 에서 카드 를 사용 하 든 가맹 점 에서 카드 를 사용 하 든 모두 활동 적 점 수 를 정확하게 계산 할 수 있다.
    public void testMarket(){
        MarketBranch rootMarket=new MarketBranch("  ");
    MarketBranch shenBranch=new MarketBranch("    ");
    
    MarketJoin marketJoin1=new MarketJoin("       ");
    MarketJoin marketJoin2=new MarketJoin("       ");
    
    rootMarket.add(shenBranch);
    
    shenBranch.add(marketJoin1);
    shenBranch.add(marketJoin2);
    
    rootMarket.PayByCard();
    
    }
    public class MarketBranch extends Market {
    
        public MarketBranch(String name){
            this.name=name;
    }
    
        //      
    List list = new ArrayList();
    
    @Override
    public void add(Market m) {
            list.add(m);
    }
    
        @Override
    public void remove(Market m) {
            list.remove(m);
    }
    
        // @Override
    public void PayByCard() {
            System.out.println(name + "  ,          ");
            for (Market m : list) {
                m.PayByCard();
    }
        }
    }
    /**
     * Created by Administrator on 2017/9/14.
     *    
    */
    
    public class MarketJoin extends Market{
    
    
        public MarketJoin(String name){
            this.name=name;
    }
    
    
        @Override
    public void add(Market m) {
    
        }
    
        @Override
    public void remove(Market m) {
    
        }
    
        @Override
    public void PayByCard() {
    
        }
    
    }
    /**
     * Created by Administrator on 2017/9/14.
     *  
    */
    
    public abstract class Market {
    
        String name;
    
        public abstract void add(Market m);
    
        public abstract void remove(Market m);
    
        public abstract void PayByCard();
    }

    이미지 비유:
    COMPOSITE - Mary 가 오늘 생일 이에 요."나 생일 인 데 선물 하나 줘."
    "응, 그래, 상점 에 가면 네가 골 라."
    "이 티셔츠 예뻐요.
    이 치 마 는 예뻐요.
    이 가방 도 괜찮아 요. 사 세 요. "
    "야, 세 벌 샀 잖 아. 선물 하나만 주기 로 했 어."
    "뭐야, 티셔츠 에 치마 에 가방 까지. 딱 한 벌 맞 네. 아가씨, 싸 주세요. 
    ".......................................................................
    View 와 View Group 류 의 사용.안 드 로 이 드 UI 디자인 에서 거의 모든 widget 과 레이아웃 류 는 이 두 가지 종류 에 의존 합 니 다.
    ViewGroup 은 이러한 구성 요 소 를 수용 하 는 용기 이 며, 그 자체 도 View 에서 파생 된 것 이다.
    이 를 통 해 알 수 있 듯 이 용기 의 ViewGroup 은 잎 노드 의 View 를 포함 할 수 있 습 니 다.
    더 낮은 차원 의 하위 뷰 그룹 도 포함 할 수 있 습 니 다.
    하위 ViewGroup 은 다음 잎 노드 의 View 와 ViewGroup 을 포함 할 수 있 습 니 다.
    바로 View 와 View Group 류 의 사용 입 니 다.안 드 로 이 드 UI 디자인 에서 거의 모든 widget 과 레이아웃 류 는 이 두 가지 종류 에 의존 합 니 다.
    1. 대상 View 와 ViewGroup 을 트 리 구조 로 조합 하여 '부분 - 전체' 를 나타 내 는 차원 구조 (View 는 ViewGroup 의 일부분 으로 할 수 있다).조합 모드 는 사용자 로 하여 금 하나의 대상 View 와 조합 대상 View Group 의 사용 에 일치 성 을 가지 게 한다.핫 이 슈 어휘: 부분 - 전체 용기 - 내용 트 리 구조 일치 성 잎 합성 안전성 투명 성
    저 희 는 안전 한 조합 모드 를 선택 하 십시오 (조합 대상 에 add, remove, getChild 방법 추가).
    public abstract class ViewGroup extends View implements ViewParent, ViewManager {
        private static final String TAG = "ViewGroup";
    
        private static final boolean DBG = false;
    /** @hide */
    public static boolean DEBUG_DRAW = false;
    
    
    public void addView(View child, int index) {
        if (child == null) {
            throw new IllegalArgumentException("Cannot add a null child view to a ViewGroup");
    }
        LayoutParams params = child.getLayoutParams();
        if (params == null) {
            params = generateDefaultLayoutParams();
            if (params == null) {
                throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
    }
        }
        addView(child, index, params);
    }
    public View getChildAt(int index) {
        if (index < 0 || index >= mChildrenCount) {
            return null;
    }
        return mChildren[index];
    }

    ViewManager:
    public interface ViewManager
    {
        /**
         * Assign the passed LayoutParams to the passed View and add the view to the window.
         * Throws {@link android.view.WindowManager.BadTokenException} for certain programming
         * errors, such as adding a second view to a window without removing the first view.
         * Throws {@link android.view.WindowManager.InvalidDisplayException} if the window is on a
         * secondary {@link Display} and the specified display can't be found
         * (see {@link android.app.Presentation}).
         * @param view The view to be added to this window.
         * @param params The LayoutParams to assign to view.
         */
    public void addView(View view, ViewGroup.LayoutParams params);
        public void updateViewLayout(View view, ViewGroup.LayoutParams params);
        public void removeView(View view);
    }
    

    사용처
    1. ViewPager: 추가 및 제거: 용기
    2. 부상 창: 추가 및 제거
    3. 데이터베이스: 첨삭 검사
    코드 와 데모: 왜 안 올 라 가 는 지 모 르 겠 어 요.
    참고 블 로그:
    http://blog.csdn.net/hp910315/article/details/51111478

    좋은 웹페이지 즐겨찾기