装饰设计模式——学习篇

Android学习 装饰设计模式

装饰设计模式也称包装设计模式,用来动态的扩展对象的功能,也是继承关系的的一种替代方案之一。
通俗理解,在不使用的继承的方式下,采用装饰设计模式可以扩展一个对象的功能,可以使一个对象变得越来越强大。

下面通过一个Demo来理解下装饰设计模式

调用代码

PersonEat eat = new PersonEat(); //这是没有装饰过的  只能吃困穷菜
eat.eat(); //开始吃    控制台输出  “贫穷菜”
BuyEat buyEat = new BuyrEat(eat); //装饰下 买了新的菜,既能吃贫穷菜又可以吃新的菜
buyEat.eat(); //开始吃   控制台输出  “贫穷菜”和“新的菜”
public interface Eat {// 吃饭void eat();
}public class PersonEat implements Eat {@Overridepublic void eat() {Log.e("TAG","贫穷菜");}
}public class BuyEat implements Eat {private Eat eat;public BuyEat(Eat eat){this.eat = eat;}@Overridepublic void eat() {eat.eat();Log.e("TAG","我是新的菜");}
}

RecycleView添加头部(尾部有点bug没有解决)。

调用代码

        WrapRecyclerView recycle_view = findViewById(R.id.recycle_view);recycle_view.setLayoutManager(new LinearLayoutManager(this));View view = LayoutInflater.from(this).inflate(R.layout.item_header, recycle_view, false);MyAdapter adapter = new MyAdapter();recycle_view.setAdapter(adapter);recycle_view.addHeaderView(view);
//        recyclerView.addFooterView(view2);  //尾部有bug 没有解决
public class WrapRecyclerView extends RecyclerView {private WrapRecyclerAdapter mAdapter;public WrapRecyclerView(@NonNull Context context) {this(context,null);}public WrapRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}public WrapRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic void setAdapter(@Nullable Adapter adapter) {mAdapter = new WrapRecyclerAdapter(adapter);super.setAdapter(mAdapter);}/*** 添加头部* @param view*/public void addHeaderView(View view){// 必须要设置 Adapter 之后才能添加头部和底部if(mAdapter != null){mAdapter.addHeaderView(view);}}/*** 添加底部* @param view*/public void addFooterView(View view){if(mAdapter != null){mAdapter.addFooterView(view);}}/*** 移除头部* @param view*/public void removeHeaderView(View view){if(mAdapter != null){mAdapter.removeHeaderView(view);}}/*** 移除底部* @param view*/public void removeFooterView(View view){if(mAdapter != null){mAdapter.removeFooterView(view);}}
}public class WrapRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private final RecyclerView.Adapter mAdapter;ArrayList<View> mHeaderView;ArrayList<View> mFooterView;public WrapRecyclerAdapter(RecyclerView.Adapter mAdapter) {this.mAdapter = mAdapter;mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {@Overridepublic void onChanged() {notifyDataSetChanged();}});mHeaderView = new ArrayList<>();mFooterView = new ArrayList<>();}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) {// 头部返回 头部的ViewHolderint numHeaders = getHeadersCount();if (position < numHeaders) {return createHeaderFooterViewHolder(mHeaderView.get(position));}// mRealAdapter 返回 mRealAdapter的ViewHolderfinal int adjPosition = position - numHeaders;int adapterCount = 0;if (mAdapter != null) {adapterCount = mAdapter.getItemCount();if (adjPosition < adapterCount) {return mAdapter.onCreateViewHolder(parent,mAdapter.getItemViewType(adjPosition));}}// 底部返回 底部的ViewHolderreturn createHeaderFooterViewHolder(mFooterView.get(adjPosition - adapterCount));}private RecyclerView.ViewHolder createHeaderFooterViewHolder(View view) {return new RecyclerView.ViewHolder(view){};}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {// 头部和底部是都不需要做处理的,只要 mRealAdapter 要去做处理int numHeaders = getHeadersCount();if (position < numHeaders) {return ;}final int adjPosition = position - numHeaders;int adapterCount = 0;if (mAdapter != null) {adapterCount = mAdapter.getItemCount();if (adjPosition < adapterCount) {mAdapter.onBindViewHolder(holder,adjPosition);}}}@Overridepublic int getItemCount() {return mFooterView.size() + mAdapter.getItemCount() + mHeaderView.size();}@Overridepublic int getItemViewType(int position) {return position;}public int getHeadersCount() {return mHeaderView.size();}public int getFootersCount() {return mFooterView.size();}public void addHeaderView(View view) {if (!mHeaderView.contains(view)) {mHeaderView.add(view);notifyDataSetChanged();}}public void addFooterView(View view) {if (!mFooterView.contains(view)) {mFooterView.add(view);notifyDataSetChanged();}}public void removeHeaderView(View view) {if (mHeaderView.contains(view)) {mHeaderView.remove(view);notifyDataSetChanged();}}public void removeFooterView(View view) {if (mFooterView.contains(view)) {mFooterView.remove(view);notifyDataSetChanged();}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部