Android中常見的設計模式

來源:互聯網
上載者:User

標籤:ibinder   data   基類   獨立   span   軟體   不能   自己   androi   

自己理解的設計模式遵循的原則:

1)功能單一明確,設計一個類的意圖要明確,不能大包大攬什麼功能都繼承進去

2)對於擴充要開放,修改要關閉。軟體通常都有需求變化,變化過程中通過擴充的方式來實現需求變化,而不是通過修改原有的方法,因為修改原有的方法會導致原來方法的調用方會出問題,這樣層層調用出問題。

3)變化的進行抽象,不變的進行具體。設計代碼過程中會面對很對可變的東西,比如在實現一個功能的時候,能夠運用不同的方式進行實現,這個時候可以將每個具體的實現方法進行抽象,真正不變的是這個方法要實現的目的

單例模式:

單例模式太多了,在整個應用中只有一個,標準的單例模式寫法:

public class singleton{    private volatitle static instance; //使用volatile 表明每次都會去記憶體中讀取最新的值; static 表明組建循環和當前應用一樣    public singleton(){    }    public static singleton getInstance(){  //同樣使用靜態方法擷取         if(instance == null){              synchronized (singleton.classs){ //在多線程中擷取需要進行同步,或者會導致同步問題                   if(instance == null)                         instance = new singleton();                 }         }         return instance;    }}

 Builder模式

當需要建立一個對象需要很多變數組合而成,這個時候可以考慮將這個對象的建立過程和對象的表示分離開來,這樣可以很簡潔的構建一個複雜的對象。

常見的builder模式有建立dialog的過程。

 

AlertDialog.Builer builder=new AlertDialog.Builder(context);builder.setIcon(R.drawable.icon)    .setTitle("title")    .setMessage("message")    .setPositiveButton("Button1",         new DialogInterface.OnclickListener(){            public void onClick(DialogInterface dialog,int whichButton){                setTitle("click");            }            })    .create()    .show();

在這種情況下當建立一個dialog時,並不需要分別去為某一個對象單獨寫一個建構函式,而且建立過程一目瞭然。

策略方法模式

定義:有一系列的演算法,將每個演算法封裝起來(每個演算法可以封裝到不同的類中),各個演算法之間可以替換,策略模式讓演算法獨立於使用它的客戶而獨立變化。

比如在註冊一個使用者資訊時,可能最終會註冊到不同的伺服器上,但是對於上層代碼並不關心終端使用者資料到哪,只需要有地方儲存就可以,所以可以抽象出儲存函數,真正的實現讓其實現的子類去做。

抽象出註冊使用者資訊函數:

public interface IUserManager {    /**     * @Decription 註冊     **/    void register(final UserDALEx user, final ICallBackObject<UserDALEx> callBack);    /**     * @Decription 登陸     **/    void login(final Context context, final String name, final String psw, final ICallBackObject<UserDALEx> callBack);    /**     * @Decription 根據輸入查詢使用者     **/    void queryUsers(String username,int limit,final ICallBackObject<List<UserDALEx>> callBack);...}

定義不同的實現方法

public class BmobUserManager implements IUserManager {    @Override    public void register(UserDALEx user, final ICallBackObject<UserDALEx> callBack) {        。。。    } @Override    public void login(Context context, String name, final String psw, final ICallBackObject<UserDALEx> callBack) {       ...    } @Override    public void queryUsers(String username, int limit, final ICallBackObject<List<UserDALEx>> callBack) {        ....    }

當然這裡還肯定可以用其他對象的方法去實現它。在應用的初始化中過程中設定使用哪一種方法.

//初始化雲資料庫        IUserManager userManager = new BmobUserManager();        Bmob.initialize(this, NCAppContext.ApplicationID);        CloudManager.getInstance().setUserManager(userManager);。。。}

 

Factory 方法模式
我們建立的activity或者fragment中,定義基類的時候,可以將每個介面不同的地方抽象出來,讓真正實現的子類去實現該統一的方法。

基類的方法

public interface IBase<P> {    /**     * 功能描述:給view綁定資料     **/    void onInitView(Bundle savedInstanceState);    /**     * 功能描述:獲得布局檔案Id     **/    int getLayoutResource();}

在不同的實現子類activity或者fragment中去實現該方法

public class LoginActivity implements  IBaseview{   @Override    public void onInitView(Bundle savedInstanceState) {     //....    }       @Override    public int getLayoutResource() {        return R.layout.activity_login;    }}


觀察者模式

在安卓中觀察者模式用的比較多的地方在資料庫變化或者listview內容有變化時,使用notifyDataSetChanged()方法。

public ContactListAdapter netAdapter;mNetDataList.addAll(mList);netAdapter.notifyDataSetChanged();
notifyDataSetChanged()該函數的定義在adapter中
public final void notifyDataSetChanged() {       mObservable.notifyChanged();}

通知所有被觀察者去更新。


組合模式

這種模式在安卓中最常見,Android中的view是一種樹形結構,每個viewGroup包含一些列的view,而每個viewGroup本身又可以當做一個view,所以最終手機上呈現出來的介面,是由一個個view組合而成的。

適配模式

其實適配器模式很容易理解,我們在Android開發時也經常用到。比較典型的有ListView和RecyclerView。為什麼ListView需要使用適配器呢?主要是,ListView只關心它的每個ItemView,而不關心這個ItemView具體顯示的是什麼。而我們的資料來源存放的是要顯示的內容,它儲存了每一個ItemView要顯示的內容。ListView和資料來源之間沒有任何關係,這時候,需要通過適配器,適配器提供getView方法給ListView使用,每次ListView只需提供位置資訊給getView函數,然後getView函數根據位置資訊向資料來源擷取對應的資料,根據資料返回不同的View。

模板方法模式

定義:定義一個操作中的演算法架構,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定的步驟。

這種模式也相當常見,比如我們的activity或者fragment,在base中定義了一些列的周期函數,基本把整個activity的架構全部定義好了,所以我們只需要進程基類的activity或者fragment方法,然後在定義好的周期函數中實現我們需要的內容就可以,而不用關心整個activity的啟動所有過程。

代理模式

定義:為其他類提供一種代理以控制這個對象的訪問。

在安卓中進程通訊是一個很常見的東西,如果需要進行進程通訊則可以通過使用AIDL來擷取遠程service的代理,然後我們可以通過這個代理來執行響應的操作。

private ServiceConnection mServiceConnection = new ServiceConnection(){     @Override     public void onServiceConnected(ComponentName name, IBinder service){            mTransation = ITransactionManager.Stub.asInterface(service);           ....      }         }

 

上面介紹的都是app代碼中很常見,並且我們在設計代碼是經常會用到的,當然在還有其他很多設計模式沒有介紹,這裡就不一一介紹了。

 

Android中常見的設計模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.