代理(Proxy)模式【Java设计模式】

代理模式

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的代理模式了。

 

Java的代理模式

1.静态代理

//定义一个接口
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接口并实现了其中的方法。

  缺点:这种实现方式很直观也很简单,但其缺点是代理对象必须提前写出,如果接口层发生了变化,代理对象的代码也要进行维护。如果能在运行时动态地写出代理对象,不但减少了一大批代理类的代码,也少了不断维护的烦恼,不过运行时的效率必定受到影响。这种方式就是接下来的动态代理。

 

2.动态代理

还是一样先定义接口并且实现其方法。

//定义一个接口
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();
    }
}

运行效果:

 

你可能感兴趣的:(安卓设计模式,面试知识,java)