代理模式在java 中的使用很常見,在Android中使用更為常見,類似代理一些生命周期,或者AOP編程以及業(yè)務解耦等等使用場景。
- 代理模式分為靜態(tài)代理和動態(tài)代理。
靜態(tài)代理
interface BaseView {
void showText();
}
class ProxyView implements BaseView{
public static final String TAG = BaseView.class.getSimpleName();
@Override
public void showText() {
Log.d(TAG, "niubility");
}
}
class UserProxyView implements BaseView{
public static final String TAG = UserProxyView.class.getSimpleName();
UserProxyView mView = new UserProxyView();
@Override
public void showText() {
mView.showText();
Log.d(TAG, "niubility +1");
}
}
public class Test{
public static void test(){
UserProxyView view = new UserProxyView();
view.showText();
// niubility
// niubility +1
}
}
- 1.以上是最簡單的靜態(tài)代理的demo,可以看到通過代理模式,適合衍生對業(yè)務來進行解耦。但隨著業(yè)務量巨大的情況下,基類也來越多,會造成代碼量越來越多。
動態(tài)代理
動態(tài)代理一般用來解耦和aop進行埋點操作。其實嘗試過用這種模式來進行解耦,但是由于過于復雜,可以簡略一下,用其思想,對Activity 或者Fragment 等的生命周期進行代理,將耦合業(yè)務剝離出去。
public class DynamicProxy {
public static void main(String[] args) {
ProxyHandler handler = new ProxyHandler();
DynamicBaseView view = (DynamicBaseView) handler.setProxyObject(new ProxyDynamicView());
view.showText();
}
}
interface DynamicBaseView {
void showText();
}
class ProxyDynamicView implements BaseView {
public static final String TAG = ProxyDynamicView.class.getSimpleName();
@Override
public void showText() {
Log.d(TAG, "niubility Dynamic");
}
}
class ProxyHandler implements InvocationHandler {
public static final String TAG = ProxyHandler.class.getSimpleName();
private Object mObject;
public Object setProxyObject(Object o) {
mObject = 0;
return Proxy.newProxyInstance(mObject.getClass().getClassLoader(),
mObject.getClass().getInterfaces()
, this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// AOP
// 切入前操作
Object obj = method.invoke(mObject, args);
Log.d(TAG, "niubility Dynamic +1");
// 切入后操作
return obj;
}
}
- InvocationHandler java 已經(jīng)為我們提供了動態(tài)代理機制,簡單了解便可以直接拿來用了。
- 動態(tài)代理機制就實現(xiàn)了AOP 編程。