美文网首页
Android设计模式之代理模式

Android设计模式之代理模式

作者: TangBuzhi | 来源:发表于2017-10-17 11:37 被阅读0次

代理模式

1.定义:

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

2.使用场景:

当无法或不想直接访问某个对象或访问某个对象存在困难时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需实现相同的接口。

3.UML图

4.详解:

代理模式(Proxy Pattern)也称为委托模式,属于结构型设计模式。代理模式可以大致分为两大部分:静态代理和动态代理。静态代理:在代理前,代理类的class就已经存在;动态代理:与静态代理恰好相反,它是通过反射机制动态的生成代理者的对象,即在代理前,压根儿就不知道要代理谁,也不需要知道代理谁,具体要代理谁由执行阶段决定。下面通过代理案例来说明该模式,详见如下代码:

public interface ILawsuit {
        void submit();//提交申请

        void burden();//进行举证

        void defend();//开始辩护

        void finish();//诉讼完成
    }

这是诉讼通用接口,一般代理对象(诉讼人)与委托对象(律师)都需实现该接口。接着是代理对象与委托对象代码,如下:

    public static class Xiaoming implements ILawsuit {
        @Override
        public void submit() {
            System.out.println("老板拖欠工资,特此申请仲裁");
        }

        @Override
        public void burden() {
            System.out.println("劳动合同与过去一年的工资流水");
        }

        @Override
        public void defend() {
            System.out.println("证据确凿,无需辩护");
        }

        @Override
        public void finish() {
            System.out.println("诉讼成功,老板三日内结清工资");
        }
    }

public static class Lawyer implements ILawsuit {
        private ILawsuit lawsuit;

        public Lawyer(ILawsuit lawsuit) {
            this.lawsuit = lawsuit;
        }

        @Override
        public void submit() {
            lawsuit.submit();
        }

        @Override
        public void burden() {
            lawsuit.burden();
        }

        @Override
        public void defend() {
            lawsuit.defend();
        }

        @Override
        public void finish() {
            lawsuit.finish();
        }
    }

测试代码:

public static void main(String[] args) {
        ILawsuit xiaoming = new Xiaoming();
        ILawsuit lawyer = new Lawyer(xiaoming);
        lawyer.submit();//老板拖欠工资,特此申请仲裁
        lawyer.burden();//劳动合同与过去一年的工资流水
        lawyer.defend();//证据确凿,无需辩护
        lawyer.finish();//诉讼成功,老板三日内结清工资
    }

通过上面的阐述可知,上面这种代理属于静态代理,因为在代理前,委托对象(律师)就已经存在了。
下面讲述一下动态代理,在java中,java给我们提供了一个便捷的动态代理接口InvocationHandler,实现该接口并重写invoke方法即可。代码如下:

public static 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;
        }
    }

测试代码:

public static void main(String[] args) {
       ILawsuit xiaoMing = new Xiaoming();
       DynamicProxy dynamicProxy = new DynamicProxy(xiaoMing);
       ClassLoader classLoader = xiaoMing.getClass().getClassLoader();
       ILawsuit dynamicLawyer = (ILawsuit) Proxy.newProxyInstance(classLoader, new Class[]{ILawsuit.class}, dynamicProxy);
       dynamicLawyer.submit();//老板拖欠工资,特此申请仲裁
       dynamicLawyer.burden();//劳动合同与过去一年的工资流水
       dynamicLawyer.defend();//证据确凿,无需辩护
       dynamicLawyer.finish();//诉讼成功,老板三日内结清工资
   }

5.代码托管地址

代理模式

相关文章

  • Android 代理模式

    Android 设计模式系列文章 Android 23种设计模式 前言 代理模式可能是我们平时开发中最常见的模式之...

  • 【设计模式Android】中介者模式

    设计模式Android 其他相关文章:【设计模式Android】设计模式六大原则【设计模式Android】代理模式...

  • Android 设计模式之简单工厂模式

    设计模式系列文章 Android 设计模式之单例模式 Android 设计模式之Builder模式 Android...

  • 动态代理原理解析

    注:源自于Android 一、代理模式 代理模式是java23种设计模式常用的一种设计模式。代理模式是客户端不直接...

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • 【设计模式Android】代理模式

    设计模式Android 其他相关文章:【设计模式Android】设计模式六大原则 定义:为其他对象提供一种代理以控...

  • 代理模式(Proxy Pattern):动态代理 - 最易懂的设

    前言 今天我来全面总结Android开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍1分钟全...

  • 代理模式

    Android进阶之设计模式 代理模式 定义: 为其他对象提供一种代理以控制对这个对象的访问. 使用场景: 当无法...

  • Android 设计模式之代理模式

    一、代理模式的介绍 定义:为其他的对象提供一种代理,控制这个对象的访问。使用场景:当无法或者不想直接访问某个对象后...

  • android设计模式之代理模式

    静态代理 基本概念 角色划分 简单理解: 当其他对象对某个目标对象进行操作且需要对目标对象进行更改时,若目标对...

网友评论

      本文标题:Android设计模式之代理模式

      本文链接:https://www.haomeiwen.com/subject/ovoruxtx.html