Android设计模式

Android设计模式-17-代理模式

2018-06-15  本文已影响49人  今阳说

1. 定义

2. 使用场景

3. 优缺点

4. Android源码中的使用

代理模式在Android源码中还是用很多应用的,例如用ActivityManagerProxy代理ActivityManagerServixe,且二者处于各自的独立进程中,属于远程代理

5. 实例演示

以公司拖欠工资,员工进行诉讼(打官司)为例,正常来说是需要找律师作为代理的

  1. 创建一个诉讼流程的接口
 public interface ILawsuit {
        void submit();//提交申请

        void burden();//举证

        void defend();//辩护

        void finish();//诉讼完成
    }
  1. 创建被代理者,即员工
class PersonA implements ILawsuit {

        @Override
        public void submit() {
            LjyLogUtil.i(String.format("%s:老板拖欠工作,申请仲裁呀", this.getClass().getSimpleName()));
        }

        @Override
        public void burden() {
            LjyLogUtil.i(String.format("%s:这是合同和银行流水", this.getClass().getSimpleName()));
        }

        @Override
        public void defend() {
            LjyLogUtil.i(String.format("%s:证据确凿,还我公道", this.getClass().getSimpleName()));
        }

        @Override
        public void finish() {
            LjyLogUtil.i(String.format("%s:诉讼成功,七日内结算", this.getClass().getSimpleName()));
        }
    }
  1. 创建代理类,即律师
 public class Lawyer implements ILawsuit {
        private ILawsuit mILawsuit;//持有的被代理者的引用

        public Lawyer(ILawsuit lawsuit) {
            mILawsuit = lawsuit;
        }

        @Override
        public void submit() {
            LjyLogUtil.i(String.format("%s:我是律师,我为%s代言", this.getClass().getSimpleName(), mILawsuit.getClass().getSimpleName()));
            mILawsuit.submit();
        }

        @Override
        public void burden() {
            LjyLogUtil.i(String.format("%s:我是律师,我为%s代言", this.getClass().getSimpleName(), mILawsuit.getClass().getSimpleName()));
            mILawsuit.burden();
        }

        @Override
        public void defend() {
            LjyLogUtil.i(String.format("%s:我是律师,我为%s代言", this.getClass().getSimpleName(), mILawsuit.getClass().getSimpleName()));
            mILawsuit.defend();
        }

        @Override
        public void finish() {
            LjyLogUtil.i(String.format("%s:我是律师,我为%s代言", this.getClass().getSimpleName(), mILawsuit.getClass().getSimpleName()));
            mILawsuit.finish();
        }
    }
  1. 创建实例进行诉讼流程
 private void methodProxyPattern() {
        PersonA personA = new PersonA();
        LjyLogUtil.i("------静态代理模式-----------");
        Lawyer lawyer = new Lawyer(personA);
        lawyer.submit();
        lawyer.burden();
        lawyer.defend();
        lawyer.finish();
    }

上面就是一个简单的代理模式了,另外还有一种实现方式,就是使用动态代理:
3_2. 创建动态代理类

    //动态代理
    class DynamicProxy implements InvocationHandler {
        private Object obj;//被代理的类引用

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

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //调用被代理类对象的方法
            Object result = method.invoke(obj, args);
            return result;
        }
    }

4_2. 创建实例进行诉讼流程

 private void methodProxyPattern() {
        PersonA personA = new PersonA();
       LjyLogUtil.i("------动态代理模式-----------");
        //用反射机制实现
        DynamicProxy proxy = new DynamicProxy(personA);
        ClassLoader loader = personA.getClass().getClassLoader();
        //动态构造一个代理者律师
        ILawsuit lvShi = (ILawsuit) Proxy.newProxyInstance(loader, new Class[]{ILawsuit.class}, proxy);
        lvShi.submit();
        lvShi.burden();
        lvShi.defend();
        lvShi.finish();
    }
上一篇 下一篇

猜你喜欢

热点阅读