android
代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。
比如有个程序员对象叫ODP,这个对象有一个写代码的方法叫code()。
public class ODP {
public void code(){
Log.d("odp","我会写代码");
}
}
如果此时我们想这位程序员在写代码前先去锻炼身体,写代码后去跟女性朋友约会,那我们就在code()方法里面进行拓展:
public class ODP {
public void code(){
Log.d("odp","去跑步!");
Log.d("odp","我会写代码");
Log.d("odp","去越会咯~");
}
}
但是往往不能直接对源代码进行修改,这时就需要用到java的代理模式了。
//定义一个接口
public interface ICode {
void code();
}
//该ODP对象实现我们定义的接口
public class ODP implements ICode{
@Override
public void code() {
Log.d("odp","我会写代码");
}
}
//定义一个代理对象
public class ODPProxy implements ICode{
private ODP odp;
public ODPProxy(ODP odp) {
this.odp=odp;
}
@Override
public void code() {
Log.d("odp","去跑步");
odp.code();
Log.d("odp","去约会咯");
}
}
执行:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ODP odp = new ODP();
ODPProxy odpProxy = new ODPProxy(odp);
odpProxy.code();
}
}
总结:其实这里做的事情无非就是,创建一个代理类ODPProxy,继承了ICode接口并实现了其中的方法。
缺点:这种实现方式很直观也很简单,但其缺点是代理对象必须提前写出,如果接口层发生了变化,代理对象的代码也要进行维护。如果能在运行时动态地写出代理对象,不但减少了一大批代理类的代码,也少了不断维护的烦恼,不过运行时的效率必定受到影响。这种方式就是接下来的动态代理。
还是一样先定义接口并且实现其方法。
//定义一个接口
public interface ICode {
void code();
}
//该ODP对象实现我们定义的接口
public class ODP implements ICode{
@Override
public void code() {
Log.d("odp","我会写代码");
}
}
直接去测试地方,调用Proxy类的静态方法newProxyInstance即可,该方法会返回代理类对象
static Object newProxyInstance(ClassLoader loader, Class>[] interfaces,InvocationHandler h )
接收的三个参数依次为:
ClassLoader loader:
指定当前目标对象使用类加载器,写法固定Class>[] interfaces:
目标对象实现的接口的类型,写法固定InvocationHandler h
:事件处理接口,需传入一个实现类,一般直接使用匿名内部类public class MainActivity extends AppCompatActivity {
private ODP odp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
odp = new ODP();
ICode proxy = (ICode) Proxy.newProxyInstance(odp.getClass().getClassLoader(),
odp.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Log.e("odp", "去跑步咯");
Object invoke = method.invoke(odp, args);
Log.e("odp", "去约会咯~");
return invoke;
}
});
proxy.code();
}
}
运行效果: