android源碼中使用的設計模式(結構型模式--代理模式,行為型模式--迭代器模式)

1.代理模式

1.1定義

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

1.2 UML

代理模式
  • Subject:抽象主題類。聲明真實主題與代理的共同接口方法,該類既可以是一個接口也可以是一個抽象類
  • RealSubject:真實主題類,也叫委托類或者代理類
  • PoxySubject:代理類,該類持有一個對真實主題類的引用,在其實現接口方法中調用了真實主題中相應的接口方法執行
  • Client:客戶端,使用代理類的類型

PS:代理類對被代理對象有控制權,可以決定代理類是否執行

1.3使用場景

當不想直接訪問或者訪問某個對象困難時,可以通過代理訪問這個對象,訪問對象和被訪問對象有一個共同的接口。

1.4 Java中的動態代理

Java動態代理類

java動態代理位于java.lang.reflect包下,一般主要涉及到以下兩個類:

  • A. Interface InvocationHandler:該接口中僅定義了一個方法Object:invoke(Object obj,Method method,Object[] args )
    在實際使用時,第一個參數obj一般是指代理類,method是被代理的方法,args為該方法的參數數組。這個抽象方法在動態代理類中動態實現。
  • B. Proxy:動態代理類
  1. Protected Proxy(InvocationHandler h):構造函數,用于給內部的h賦值
  2. Static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個 代理類,其中loader是類裝載器,interfaces是真實類所擁有的全部接口的數組。
  3. Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
    返回代理類的一個實例,返回后的代理類可以當作被代理類使用 (可使用被代理類的在Subject接口中聲明過的方法)。

1.5 代碼實現

A.動態代理和靜態代理一樣的部分

Subject:抽象主題

subject

realSubject:具體實現類

RealSubject

B.不要一樣的部分

1.靜態代理

PoxySubject

2.靜態代理調用

client

3.動態代理

動態代理

4.動態代理調用

動態代理調用

1.6 android源碼中的實現

android源碼中的代理模式
  • 1.IActivityManager作為ActivityManagerProxy和ActivityManagerNative的公共接口,所以兩個類具有部分相同的接口,可以實現合理的代理模式
  • 2.ActivityManagerProxy代理類是ActivityManagerNative的內部類
  • 3.ActivityManagerNative是個抽象類,真正發揮作用的是它的子類ActivityManagerService(系統Service組件)。
  • 4.ActivityManagerService是系統統一的Service,運行在獨立的進程中;通過系統ServiceManger獲取;ActivityManager運行在一個進程里面,ActivityManagerService運行在另一個進程內,對象在不同的進程里面,其地址是相互獨立的;采用Binder機制跨進程通信,所以我們可以得出這是一個RemoteProxy。

2.迭代器模式

2.1 定義

提供一中方法順序訪問一個容器對象的各個元素,而且不需要暴露該對象的內部表示。

2.2 UML

迭代器模式
  • Iterator:迭代器接口,負責定義訪問和遍歷元素的接口
  • ConcreteIterator:具體迭代器,主要是實現迭代器接口,并記錄遍歷的當前位置
  • Aggregate:容器接口類,負責提供創建具體迭代器角色接口
  • ConcreteAggregate:具體的容器類,具體迭代器角色與該容器相關聯

2.3 具體實現

1.創建Iterator

public interface Iterator<T> {
    boolean hasNaxt();
    T next();
}

2.創建ConcreteIterator

具體實現

3.創建aggregate

public interface Aggregat<T> {
    void add(T obj);
 
    void remove(T obj);
 
    Iterator<T> iterator();
}

4.創建具體的aggregate

關聯

5.調用方法

調用方法

2.4 adroid源碼中的模式實現

  • A.典型的例子是數據庫查詢使用的Cursor,當我們使用SQLiteDatabase的query方法查詢數據庫,會返回一個Cursor游標對象,這個游標對象就是一個具體的迭代器。

  • B.在android我們很少自己定義一個Iterator。一般都是使用。在java中List,arrayList 中對存在一個iterator。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容