안 드 로 이 드 디자인 모델 --- 장식 디자인 모델

4576 단어
1. 핵심 사상:
장식 디자인 모델 은 포장 디자인 모델 이 라 고도 부 르 는데 사용 하지 않 는 계승 방식 에서 대상 의 기능 을 확대 한다.
간단 한 실현
인터페이스 Person, 두 개의 실현 클래스 PersonA, PersonB 를 정의 합 니 다.
public interface Person {
    void dressed();
}

public class PersionA implements Person {
    @Override
    public void dressed() {
        Log.d("66", "A   ");
    }
}

public class PersionB implements Person {
    @Override
    public void dressed() {
        Log.d("66", "B   ");
    }
}

장식 류 DecoratePerson, DecoratePerson 은 많은 기능 을 확장 할 수 있 으 며 PersonA 와 PersonB 의 내용 을 바 꿀 필요 가 없습니다.
public class DecoratePerson implements Person {

    private Person mPerson;

    public DecoratePerson(Person person){
        this.mPerson = person;
    }

    @Override
    public void dressed() {
        Log.d("66", "    ");
        mPerson.dressed();
        Log.d("66", "     ");
    }
}

호출
public void test(){
        start(new DecoratePerson(new PersionA()));
        start(new DecoratePerson(new PersionB()));
    }

    public void start(Person persion){
        persion.dressed();
    }

결실
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66:     
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66: A   
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66:      
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66:     
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66: B   
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66:      

3. 실제 응용
사고: RecyclerView 는 머리 와 아래쪽 레이아웃 View 대상 의 추 가 를 지원 하지 않 지만 ListView 는 지원 합 니 다.저희 가 RecyclerView 에 머리 와 꼬리 를 추가 하려 면 어떻게 해 야 하나 요?
아래 코드 는 참고 만 합 니 다: 특별히 완벽 하지 않 습 니 다.
public class WrapAdapter extends Adapter {

    private final int TYPE_HEAD = 100000;
    private final int TYPE_FOOT = 200000;
    private Adapter mAdapter;
    private View mHeadView;
    private View mFootView;
    private int mCount;


    public WrapAdapter(@NonNull Adapter adapter){
        this.mAdapter = adapter;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        Log.d("66","viewType="+viewType);
        if(viewType == TYPE_HEAD) {
            return new LiysViewHolder(mHeadView);
        }
        if(viewType>=getItemCount()-1 && mFootView!=null) {
            return new LiysViewHolder(mFootView);
        }
        return mAdapter.onCreateViewHolder(viewGroup, viewType);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        int mAdapterPosition = position;
        if(mHeadView != null){ //     
            if(position==0){
                return;
            }else{
                mAdapterPosition = position-1;
            }
        }
        if(mFootView != null){ //     
            if(position>=mCount-1){ //    
                return;
            }
        }
        mAdapter.onBindViewHolder(viewHolder,mAdapterPosition);
    }


    @Override
    public int getItemViewType(int position) {
        if(isHeadView(position)){
            return TYPE_HEAD;
        }
        if(isFootView(position)){
            return TYPE_FOOT;
        }
        return position;
    }

    @Override
    public int getItemCount() {
        mCount = mAdapter.getItemCount();
        if(mHeadView != null){
            mCount++;
        }
        if(mFootView != null){
            mCount++;
        }
        return mCount;
    }

    //    
    private boolean isHeadView(int position){
        return position==0 && mHeadView != null;
    }

    //    
    private boolean isFootView(int position){
        return position>=(getItemCount()-1) && mFootView != null;
    }

    public void addHeadView(View headView){
        this.mHeadView = headView;
        this.notifyDataSetChanged();
    }
    public void addFootView(View footView){
        this.mFootView = footView;
        this.notifyDataSetChanged();
    }

    public void removeHeadView(){
        this.mHeadView = null;
        this.notifyDataSetChanged();
    }
    public void removeFootView(){
        this.mFootView = null;
        this.notifyDataSetChanged();
    }

    class LiysViewHolder extends RecyclerView.ViewHolder {

        public LiysViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }
}

좋은 웹페이지 즐겨찾기