1、設計模式android
設計模式是一套被反覆使用的、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。它與架構的區別在於設計模式比架構更抽象,是比架構更小的體系結構元素,是從代碼層面總結的實現一個模塊最優的方法。而常見的設計模式按照範圍能夠分爲類模式和對象模式,按照目的能夠分爲建立型模式、結構型模式、行爲型模式。建立型模式是對象實例化的模式,建立型模式用於解耦對象的實例化過程,包括抽象工廠模式、生成器模式、工廠模式、原型模式、單件模式;結構型模式是把類或對象結合在一塊兒造成一個更大的結構,包括適配器模式(類對象)、組合模式(對象)、裝飾模式(對象);行爲型模式是描述類和對象如何交互,及劃分責任和算法,包括迭代器模式、觀察者模式、狀態模式。在本篇文章中將採用結構模式中的適配器模式。算法
2、適配器模式(Adapter)設計模式
結構型模式涉及到如何組合類和對象以得到更大的結構,它的類模式採用繼承機制來組合接口或者實現。其中的適配器模式是將一個類的接口轉化爲客戶但願的另一個接口,Adapter模式使得本來因爲接口不兼容而不可以在一塊兒工做的類能夠一塊兒工做。在對象適配器模式中,適配器與適配者之間是關聯關係;在類適配器模式中,適配器與適配者之間是繼承(或實現)關係。架構
首先已存在一個類和一個接口:app
public class Adaptee { public void adapteeRequest() { System.out.println("被適配者的方法"); } } public interface Target { void request(); }
爲了在目標接口中的 request()
調用 Adaptee
的 adapteeRequest()
方法,直接定義一個類使用Target接口直接調用是行不通的,此時就須要一個適配器類來實現 Target
接口。ide
對於類適配器而言:函數
它經過一個適配器類,實現 Target
接口,同時繼承了 Adaptee
類,而後在實現的 request()
方法中調用父類的 adapteeRequest()
spa
public class Adapter extends Adaptee implements Target{ @Override public void request() { //...... super.adapteeRequest(); //...... } }
而對於對象適配器:設計
它是經過關聯實現的:code
public class Adapter implements Target{ // 適配者是對象適配器的一個屬性 private Adaptee adaptee = new Adaptee(); @Override public void request() { //... adaptee.adapteeRequest(); //... } }
3、實例應用
在前文中簡單介紹了適配器模式的基本概念,在這一部分經過一段實例代碼來展現適配器模式在實際中的應用。
在安卓開發中,適配器模式的應用十分普遍,Adapter處處可見,例如咱們常常用到的ListView空間,對它的一些使用就須要用到適配器,如下是一個app源碼中ListAdapter應用:
ListAdapter接口以下:
public interface ListAdapter { public int getCount(); Object getItem(int position); long getItemId(int position); View getView(int position, View convertView, ViewGroup parent); boolean isEmpty(); }
抽象類BaseAdapter,只列出了兩個方法:
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter { // ... ... public View getDropDownView(int position, View convertView, ViewGroup parent) { return getView(position, convertView, parent); } public boolean isEmpty() { return getCount() == 0; } }
而後再定義一個類ArrayAdapter對List<T>進行封裝成ListAdapter的實現,知足ListView的調用:
public class ArrayAdapter<T> extends BaseAdapter implements Filterable { private List<T> mObjects; //構造函數,只列出了一個 public ArrayAdapter(Context context, int textViewResourceId, T[] objects) { init(context, textViewResourceId, 0, Arrays.asList(objects)); } private void init(Context context, int resource, int textViewResourceId, List<T> objects) { mContext = context; mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mResource = mDropDownResource = resource; mObjects = objects; //引用對象 mFieldId = textViewResourceId; } public int getCount() { return mObjects.size(); } public T getItem(int position) { return mObjects.get(position); } public View getView(int position, View convertView, ViewGroup parent) { return createViewFromResource(position, convertView, parent, mResource); } // ... ... }
經過這種方法,把List<T>做爲數據源以ListView想要的目標接口的樣子傳給了ListView。
4、分析
在安卓開發中咱們用到Adapter一般是如下幾種狀況:
1. 你想使用一個已經存在的類,而它的接口不符合你的需求,這個在處理舊系統時比較常見。
2. 你想建立一個能夠複用的類,該類能夠和其餘不相關的類或不可預見的累協同工做,這就是咱們android開發者常常碰到的狀況:咱們經常自定義一個新的Adapter。
3. 你想使用一些已經存在的子類,可是不可能對每個都進行子類化以匹配他們的接口,對象適配器能夠適配他的父類接口。
在其餘場景下的應用也是同樣的,引入了適配器以後,它帶來了如下這些好處:
將目標類和適配者類解耦,經過引入一個適配器類來重用現有的適配者類,無須修改原有結構。
增長了類的透明性和複用性,將具體的業務實現過程封裝在適配者類中,對於客戶端類而言是透明的,並且提升了適配者的複用性,同一個適配者類能夠在多個不一樣的系統中複用。
靈活性和擴展性都很是好,經過使用配置文件,能夠很方便地更換適配器,也能夠在不修改原有代碼的基礎上增長新的適配器類,徹底符合「開閉原則」
這種模式下的多態機制就是經過適配器實現的,它經過繼承或是關聯的方式來完成適配。
對於模塊封裝的方法,調用者封裝成一個類,被調用的適配類是一個類,適配器封裝成爲一個類。適配器模塊內聚度低,但與其餘接口的耦合度高。