1. 程式人生 > >Android中常見的設計模式

Android中常見的設計模式

use 都是 string ace ase 模式 .class 創建 是什麽

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

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

工廠方法模式
我們創建的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中常見的設計模式