代理模式的定义:
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
举例说明,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。
在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
动态代理好处
1、减少编程的工作量:假如需要实现多种代理处理逻辑,只要写多个代理处理器就可以了,无需每种方式都写一个代理类。
2、系统扩展性和维护性增强,程序修改起来也方便多了(一般只要改代理处理器类就行了)。
public class ProxyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_proxy);
//静态代理模式
Customer customer=new Customer();
customer.setCash(120000);
BuyCarProxy buyCarProxy=new BuyCarProxy(customer);
buyCarProxy.buyCar();
//动态代理模式
Customer customer1=new Customer();//我们要代理的真实对象
InvocationHandler handler=new DynamicProxy(customer1);//我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的
IBuyCar buyCar= (IBuyCar) java.lang.reflect.Proxy.newProxyInstance(handler.getClass().getClassLoader(),customer1.getClass().getInterfaces(),handler);
buyCar.buyCar();
}
}
public class Customer implements IBuyCar {
private int cash;//购车款
public int getCash(){
return cash;
}
public void setCash(int cash){
this.cash = cash;
}
@Override
public void buyCar() {
Log.e("buyCar","买一辆车花费了--》"+cash+"元");
}
}
public class BuyCarProxy implements IBuyCar {
private Customer customer;
public BuyCarProxy(Customer customer){
this.customer=customer;
}
@Override
public void buyCar() {
customer.buyCar();
}
}
public class DynamicProxy implements InvocationHandler {
Object object;//被代理类的实例对象
public DynamicProxy(Object object){// 将被代理者的实例传进动态代理类的构造函数中
this.object=object;
}
/**
* 覆盖InvocationHandler接口中的invoke()方法
* 更重要的是,动态代理模式可以使得我们在不改变原来已有的代码结构
* 的情况下,对原来的“真实方法”进行扩展、增强其功能,并且可以达到
* 控制被代理对象的行为,下面的before、after就是我们可以进行特殊
* 代码切入的扩展点了。
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=method.invoke(this.object,args);
return result;
}
}
public interface IBuyCar {
//买车
void buyCar();
}
优点
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
(3).高扩展性
github地址:https://github.com/zyj18410105150/DesignMode