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:動態代理類
- Protected Proxy(InvocationHandler h):構造函數,用于給內部的h賦值
- Static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個 代理類,其中loader是類裝載器,interfaces是真實類所擁有的全部接口的數組。
- 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。