Android开发心得之委托者模式
这一个学期在上潘老师的系统设计与分析课程时,我们小组开发了基于安卓平台的电影购票软件。在开发过程中收获了挺多,现在在课程结束前,把其分享出来。
委托者模式是软件设计模式中的一项基本技巧。
1.什么是委托者模式?
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。
维基百科
简而言之,就是一个对象A将自己的方法暴露给另一个对象B,然后在另一个对象C中使用B中A的方法,使得看起来好像在使用B的方法。
2.一个简单的委托者模式例子
class RealPrinter { // 委托方
void print() {
System.out.print("something");
// 委托的方法
}
}
class Printer { // 被委托方
RealPrinter p = new RealPrinter(); // 创建委托方
void print() {
p.print(); // 委托方法
}
}
public class Main {
// 对于第三方看起来好像Printer实际在打印
public static void main(String[] args) {
Printer printer = new Printer();
printer.print();
}
}
2.我们为什么要使用委托者模式?
原因主要是将委托者与一些实际实现的代码分离出来来达成解耦的目的,用来解决继承方法出现的类数量过于庞大的问题
3.Android下的委托者模式
Android下的listerner事件即是委托模式,比如一个Button点击事件按钮事件。
/*模拟简单的View*/
public class View {
private OnClickListener mOnClickListener;
/**
* 模拟点击事件
*/
public void clickEvent() {
if (mOnClickListener != null) {
mOnClickListener.onClick(this);
}
}
public void setOnClickListener(OnClickListener onClickListener) {
this.mOnClickListener = onClickListener;
}
/*模拟事件接口*/
public interface OnClickListener {
public ```
/*模拟简单的Activity类*/
public class Activity {
public static void main(String[] args) {
Activity activity = new Activity();
activity.onCreate();
}
/*
模拟OnCreate方法
*/
protected void onCreate() {
}
}
/*模拟委托页面*/
public class DelegationActivity
extends Activity
implements OnClickListener {
private Button mButton;
@Override
protected void onCreate() {
super.onCreate();
mButton = new Button();
mButton.setOnClickListener(this);
// 模拟点击事件
mButton.clickEvent();
}
@Override
public void onClick(View v) {
if (v == mButton) {
System.out.println("onClick() is callback!");
}
}
}
4.委托者模式在我们项目中的应用
下面的代码是我们项目中应用委托者模式来实现订票软件的地址按钮的点击响应,在实际项目中我们用适配器来实现。将控件的点击事件处理写到适配器来进行处理。
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.bk120.cinematicket.R;
import com.bk120.cinematicket.utils.PinYinUtils;
import java.util.List;
/**
* Created by WangLe on 2017/3/4.
*/
public class AddressAdapter extends RecyclerView.Adapter{
private Context mContext;
private List<String> mLists;
private AddressClickListener addressClickListener;
public AddressAdapter(Context c, List<String> l){
this.mContext=c;
this.mLists=l;
}
//分类返回ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view1=View.inflate(mContext, R.layout.addressitem,null);
AddressHolder1 holder1=new AddressHolder1(view1);
return holder1;
}
//设置监听
public void setOnAddressItemClickListener(AddressClickListener a){
this.addressClickListener=a;
}
//绑定数据
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
AddressHolder1 addressHolder1= (AddressHolder1) holder;
addressHolder1.addressTv.setText(mLists.get(position));
String now=getShouZhiMu(position);
addressHolder1.titleTv.setText(now.toUpperCase());
addressHolder1.addressLl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addressClickListener.onItemClick(position);
}
});
}
@Override
public int getItemCount() {
return mLists.size();
}
//获取当前Item的首字母
public String getShouZhiMu(int position){
char firstHanZhi = mLists.get(position).charAt(0);
char[] charPinYinChar = PinYinUtils.getCharPinYinChar(firstHanZhi);
return charPinYinChar[0]+"";
}
//地址的ViewHOlde
r
class AddressHolder1 extends RecyclerView.ViewHolder{
TextView addressTv,titleTv;
LinearLayout addressLl;
public AddressHolder1(View itemView) {
super(itemView);
addressTv= (TextView) itemView.findViewById(R.id.addressactivity_recycleview_address_item_tv);
titleTv= (TextView) itemView.findViewById(R.id.addressactivity_recycleview_address_item_title_tv);
addressLl= (LinearLayout) itemView.findViewById(R.id.addressactivity_recycleview_address_item_ll);
}
}
public interface AddressClickListener{
void onItemClick(int postion);
}
}