Android设计模式-代理

1、代理模式

定义:提供一种方式来访问对象。由于目标对象不能访问或者需要增加额外的功能

比如说,来到陌生城市,想要找住的地方,在找不到直租的情况下,我们需要通过中介来帮我们找房子(北京的中介很坑的,也没有办法)。



2、使用场景

无法访问或者不能直接访问对象时,使用代理模式来控制对对象的访问。

UML图:


3、示例

1、找房子要做的工作

public interface FindHouse {
    void findHouse();//找房子
    void payHouse();//交房租
    void leaveHouse();//退房子
}

2、找房子的人要做的具体工作

public class People implements FindHouse {
    @Override
    public void findHouse() {
        System.out.println("找房子");
    }

    @Override
    public void payHouse() {
        System.out.println("交房租");
    }

    @Override
    public void leaveHouse() {
        System.out.println("退房子");
    }
}

3、委托代理

public class ProxyHouse implements FindHouse {
    private People people;

    public ProxyHouse(People people) {
        this.people = people;
    }

    @Override
    public void findHouse() {
        people.findHouse();
    }

    @Override
    public void payHouse() {
        people.payHouse();
    }

    @Override
    public void leaveHouse() {
        people.leaveHouse();
    }
}

4、测试

public class TestProxy {
    public static void main(String[] args){
        //找房子
        FindHouse findHouse=new People();
        //委托代理
        FindHouse proxyHouse=new ProxyHouse((People) findHouse);
        proxyHouse.findHouse();
        proxyHouse.payHouse();
        proxyHouse.leaveHouse();
    }
}

运行结果:

找房子
交房租
退房子

上面这个例子很容易明白,这是静态代理。

4、代理的分类

1、静态代理:对象和代理的对象实现相同的接口或者父类。

2、动态代理:代理的对象不需要实现接口或者继承父类。而且上动态的生成。

还以上面为例:

创建动态代理对象:

public class DynamicProxy implements InvocationHandler {
    //引入被代理的对象
    private Object obj;
    public DynamicProxy(Object object){
        this.obj=object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object object=method.invoke(obj,args);
        return object;
    }
}

测试

   //动态代理示例:
        FindHouse findHouse=new People();
        DynamicProxy dynamicProxy=new DynamicProxy(findHouse);
        ClassLoader classLoader=findHouse.getClass().getClassLoader();
        FindHouse proxy= (FindHouse) Proxy.newProxyInstance(classLoader,new Class[]  {FindHouse.class},dynamicProxy);
        proxy.findHouse();
        proxy.payHouse();
        proxy.leaveHouse();

运行结果是一样的


动态代理:动态代理是在程序运行的时候,通过反射,来动态的获取对象,并且创建代理

Ref 《Android源码设计模式解析与实战》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值