AndroidAndroid开发经验谈Android开发

Android的设计模式-代理模式

2017-12-26  本文已影响227人  四月葡萄

前言

Android的设计模式系列文章介绍,欢迎关注,持续更新中:

Android的设计模式-设计模式的六大原则
一句话总结23种设计模式则
创建型模式:
Android的设计模式-单例模式
Android的设计模式-建造者模式
Android的设计模式-工厂方法模式
Android的设计模式-简单工厂模式
Android的设计模式-抽象工厂模式
Android的设计模式-原型模式
行为型模式:
Android的设计模式-策略模式
Android的设计模式-状态模式
Android的设计模式-责任链模式
Android的设计模式-观察者模式
Android的设计模式-模板方法模式
Android的设计模式-迭代器模式
Android的设计模式-备忘录模式
Android的设计模式-访问者模式
Android的设计模式-中介者模式
Android的设计模式-解释器模式
Android的设计模式-命令模式
结构型模式:
Android的设计模式-代理模式
Android的设计模式-组合模式
Android的设计模式-适配器模式
Android的设计模式-装饰者模式
Android的设计模式-享元模式
Android的设计模式-外观模式
Android的设计模式-桥接模式

1.定义

为其他对象提供一种代理以控制这个对象的访问。

2.介绍

3.UML类图

代理模式UML类图.jpg
角色说明:

4.实现

以海外代购为例,在国内的人想买国外的东西只能去找国外的人去进行代购。

4.1 创建抽象主题类

人都是有购买这个方法的:

    public interface People {
        
        void buy();//购买
    }
4.2 创建真实主题类

国内的人想购买某些产品,定义具体的购买过程:

    public class Domestic implements People {

        @Override
        public void buy() {//具体实现
            System.out.println("国内要买一个包");
        }
    }
4.3 创建代理类

海外的代购党需要知道是谁(持有真实主题类的引用)想购买啥产品:

     public class Oversea implements People {
        People mPeople;//持有People类的引用

        public Oversea(People people) {
            mPeople = people;
        }

        @Override
        public void buy() {
            System.out.println("我是海外代购:");
            mPeople.buy();//调用了被代理者的buy()方法,
        }
    }
4.5 客户端测试:
     public void test() {
        People domestic = new Domestic();        //创建国内购买人
        People oversea = new Oversea(domestic);  //创建海外代购类并将domestic作为构造函数传递
        oversea.buy();                           //调用海外代购的buy()
    }
输出结果:
我是海外代购:
国内要买一个包

5 静态代理与动态代理

  从代码的角度来分,代理可以分为两种:一种是静态代理,另一种是动态代理。

  静态代理就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。上面的例子实现就是静态代理。

  动态代理类的源码是在程序运行期间根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。

  下面我们实现动态代理,Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke()方法:

5.1 创建动态代理类
    public class DynamicProxy implements InvocationHandler {//实现InvocationHandler接口
        private Object obj;//被代理的对象

        public DynamicProxy(Object obj) {
            this.obj = obj;
        }

        //重写invoke()方法
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("海外动态代理调用方法: "+method.getName());
            Object result = method.invoke(obj, args);//调用被代理的对象的方法
            return result;
        }
    }
5.2 修改客户端的测试方法:
    public void test() {
        People domestic = new Domestic();                                 //创建国内购买人
        DynamicProxy proxy = new DynamicProxy(domestic);                  //创建动态代理
        ClassLoader classLoader = domestic.getClass().getClassLoader();   //获取ClassLoader
        People oversea = (People) Proxy.newProxyInstance(classLoader, new Class[]{People.class}, proxy); //通过 Proxy 创建海外代购实例 ,实际上通过反射来实现的。
        oversea.buy();//调用海外代购的buy()
    }
输出结果:
海外动态代理调用方法: buy
国内要买一个包
5.3 静态代理与动态代理比较

静态代理的缺点:

  1. 静态代理如果接口新增一个方法,除了所有实现类(真实主题类)需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
  2. 代理对象只服务于一种类型的对象,如果要服务多类型的对象。必须要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。

动态代理的优点:

  1. 可以通过一个代理类完成全部的代理功能,接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。当接口方法数量较多时,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
  2. 动态代理的应用使我们的类职责更加单一,复用性更强。

动态代理的缺点:

  1. 不能对类进行代理,只能对接口进行代理,如果我们的类没有实现任何接口,那么就不能使用这种方式进行动态代理(因为$Proxy()这个类集成了Proxy,Java的集成不允许出现多个父类)。

6. 应用场景

7. 优点

8. 缺点

9. Android中的源码分析

Android的源码中多个地方都用到代理模式,比如ActivityManagerProxy这个代理类。鉴于ActivityManager的代码非常复杂,这里就不进行分析了,后面会另开文章进行具体分析,这里主要对ActivityManager中的代理模式进行简单的分析一下。先看下相关类的结构图:

ActivityManager相关类的结构图.png

  由上图可以看到:ActivityManagerProxyActivityManagerNative都是实现IActivityManager这个接口,IActivityManager就是抽象主题了,ActivityManagerProxy一看就是代理类,而真实主题则是ActivityManagerNative,实际上ActivityManagerNative是个抽象类,真正的具体实现是在它的子类ActivityManagerService中。

  这里的代理实质是个远程代理,ActivityManagerProxyActivityManagerService是运行在不同的进程空间中的。

  关于代理模式的分析就到这里为止了,其他的东西就不分析了。

相关文章阅读
Android的设计模式-设计模式的六大原则
一句话总结23种设计模式则
创建型模式:
Android的设计模式-单例模式
Android的设计模式-建造者模式
Android的设计模式-工厂方法模式
Android的设计模式-简单工厂模式
Android的设计模式-抽象工厂模式
Android的设计模式-原型模式
行为型模式:
Android的设计模式-策略模式
Android的设计模式-状态模式
Android的设计模式-责任链模式
Android的设计模式-观察者模式
Android的设计模式-模板方法模式
Android的设计模式-迭代器模式
Android的设计模式-备忘录模式
Android的设计模式-访问者模式
Android的设计模式-中介者模式
Android的设计模式-解释器模式
Android的设计模式-命令模式
结构型模式:
Android的设计模式-代理模式
Android的设计模式-组合模式
Android的设计模式-适配器模式
Android的设计模式-装饰者模式
Android的设计模式-享元模式
Android的设计模式-外观模式
Android的设计模式-桥接模式

上一篇 下一篇

猜你喜欢

热点阅读