Android的开发之&java23中设计模式------>代理模式

代理模式的定义:
    代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
    举例说明,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。
    在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
动态代理好处
       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

猜你喜欢

转载自blog.csdn.net/jie1123161402/article/details/78534659