1. 程式人生 > >安卓開發心得(二)

安卓開發心得(二)

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);
    }
}