模版方法模式

来源:互联网 发布:linux oracle 自启动 编辑:程序博客网 时间:2024/06/07 17:01

作用

把都需要实现的上放到抽象父类中,具体细节交给子类实现;实现了代码的复用;

Demo

以常用的listview的adapter举例

//把通用操作抽取到抽象父类中public abstract class MyBaseAdapter<T> extends BaseAdapter {    Context mContext;    List<T> mDatas;    LayoutInflater mLayoutInflater;    public MyBaseAdapter(Context context, List<T> datas) {        mContext = context;        mDatas = datas;        mLayoutInflater=LayoutInflater.from(context);    }    @Override    public int getCount() {        return mDatas!=null?mDatas.size():0;    }    @Override    public T getItem(int position) {        return mDatas!=null?mDatas.get(position):null;    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public abstract View getView(int position, View convertView, ViewGroup parent);    //datas相关    public void setDatas(List<T> datas){        mDatas=datas;        notifyDataSetChanged();    }    public void clearDatas(){        mDatas=null;        notifyDataSetChanged();    }    public void appendDatas(List<T> datas){        if (mDatas==null)mDatas=new ArrayList<>();        mDatas.addAll(datas);    }    public void appendDatas(T data){        if (mDatas==null)mDatas=new ArrayList<>();        mDatas.add(data);    }}
public abstract class CommonAdapter<T,H> extends MyBaseAdapter<T> {    public CommonAdapter(Context context, List<T> datas) {        super(context, datas);    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        T data = mDatas.get(position);        H holder=null;        if (convertView==null){            convertView=createConvertView(mLayoutInflater,position,parent,getItemViewType(position));            holder=createViewHolder(convertView,data,position);            convertView.setTag(holder);        }else{            holder= (H) convertView.getTag();        }        bindDatas(holder,data,position);        return convertView;    }    public abstract View createConvertView(LayoutInflater layoutInflater, int position, ViewGroup parent, int itemViewType);    public abstract H createViewHolder(View convertView, T data, int position);    protected abstract void bindDatas(H holder, T data, int position);}
//细节由子类实现public class CommonAdapterDEMO extends CommonAdapter<String, CommonAdapterDEMO.Holder > {    public CommonAdapterDEMO(Context context, List datas) {        super(context, datas);    }    @Override    public View createConvertView(LayoutInflater layoutInflater, int position, ViewGroup parent, int itemViewType) {        View layout = layoutInflater.inflate(android.R.layout.simple_list_item_1, parent, false);        return layout;    }    @Override    public Holder createViewHolder(View convertView, String data, int position) {        return new Holder(convertView);    }    @Override    protected void bindDatas(Holder holder, String data, int position) {        holder.tv.setText(data);    }    class Holder {        TextView tv;        public Holder(View view) {            tv= (TextView) view.findViewById(android.R.id.text1);        }    }}
原创粉丝点击