1.代理模式
1.1定義
為其他對象提供一種代理以控制對這個對象的訪問恨闪。
1.2 UML
代理模式
- Subject:抽象主題類。聲明真實主題與代理的共同接口方法置谦,該類既可以是一個接口也可以是一個抽象類
- RealSubject:真實主題類堂鲤,也叫委托類或者代理類
- PoxySubject:代理類,該類持有一個對真實主題類的引用媒峡,在其實現(xiàn)接口方法中調(diào)用了真實主題中相應的接口方法執(zhí)行
- Client:客戶端瘟栖,使用代理類的類型
PS:代理類對被代理對象有控制權(quán),可以決定代理類是否執(zhí)行
1.3使用場景
當不想直接訪問或者訪問某個對象困難時谅阿,可以通過代理訪問這個對象半哟,訪問對象和被訪問對象有一個共同的接口酬滤。
1.4 Java中的動態(tài)代理
Java動態(tài)代理類
java動態(tài)代理位于java.lang.reflect包下,一般主要涉及到以下兩個類:
- A. Interface InvocationHandler:該接口中僅定義了一個方法Object:invoke(Object obj,Method method,Object[] args )
在實際使用時寓涨,第一個參數(shù)obj一般是指代理類盯串,method是被代理的方法,args為該方法的參數(shù)數(shù)組戒良。這個抽象方法在動態(tài)代理類中動態(tài)實現(xiàn)体捏。 - B. Proxy:動態(tài)代理類
- Protected Proxy(InvocationHandler h):構(gòu)造函數(shù),用于給內(nèi)部的h賦值
- Static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個 代理類糯崎,其中l(wèi)oader是類裝載器几缭,interfaces是真實類所擁有的全部接口的數(shù)組。
- Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
返回代理類的一個實例沃呢,返回后的代理類可以當作被代理類使用 (可使用被代理類的在Subject接口中聲明過的方法)奏司。
1.5 代碼實現(xiàn)
A.動態(tài)代理和靜態(tài)代理一樣的部分
Subject:抽象主題
subject
realSubject:具體實現(xiàn)類
RealSubject
B.不要一樣的部分
1.靜態(tài)代理
PoxySubject
2.靜態(tài)代理調(diào)用
client
3.動態(tài)代理
動態(tài)代理
4.動態(tài)代理調(diào)用
動態(tài)代理調(diào)用
1.6 android源碼中的實現(xiàn)
android源碼中的代理模式
- 1.IActivityManager作為ActivityManagerProxy和ActivityManagerNative的公共接口,所以兩個類具有部分相同的接口樟插,可以實現(xiàn)合理的代理模式
- 2.ActivityManagerProxy代理類是ActivityManagerNative的內(nèi)部類
- 3.ActivityManagerNative是個抽象類,真正發(fā)揮作用的是它的子類ActivityManagerService(系統(tǒng)Service組件)竿刁。
- 4.ActivityManagerService是系統(tǒng)統(tǒng)一的Service黄锤,運行在獨立的進程中;通過系統(tǒng)ServiceManger獲仁嘲荨鸵熟;ActivityManager運行在一個進程里面,ActivityManagerService運行在另一個進程內(nèi)负甸,對象在不同的進程里面流强,其地址是相互獨立的;采用Binder機制跨進程通信呻待,所以我們可以得出這是一個RemoteProxy打月。
2.迭代器模式
2.1 定義
提供一中方法順序訪問一個容器對象的各個元素,而且不需要暴露該對象的內(nèi)部表示蚕捉。
2.2 UML
迭代器模式
- Iterator:迭代器接口奏篙,負責定義訪問和遍歷元素的接口
- ConcreteIterator:具體迭代器,主要是實現(xiàn)迭代器接口迫淹,并記錄遍歷的當前位置
- Aggregate:容器接口類秘通,負責提供創(chuàng)建具體迭代器角色接口
- ConcreteAggregate:具體的容器類,具體迭代器角色與該容器相關聯(lián)
2.3 具體實現(xiàn)
1.創(chuàng)建Iterator
public interface Iterator<T> {
boolean hasNaxt();
T next();
}
2.創(chuàng)建ConcreteIterator
具體實現(xiàn)
3.創(chuàng)建aggregate
public interface Aggregat<T> {
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
}
4.創(chuàng)建具體的aggregate
關聯(lián)
5.調(diào)用方法
調(diào)用方法
2.4 adroid源碼中的模式實現(xiàn)
A.典型的例子是數(shù)據(jù)庫查詢使用的Cursor敛熬,當我們使用SQLiteDatabase的query方法查詢數(shù)據(jù)庫肺稀,會返回一個Cursor游標對象,這個游標對象就是一個具體的迭代器应民。
B.在android我們很少自己定義一個Iterator话原。一般都是使用夕吻。在java中List,arrayList 中對存在一個iterator稿静。