• 第九讲、代理模式


    1.定义

    Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理以控制对这个对象的访问。

    所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。

    2.代理模式的结构

       

    3.代理模式的角色和职责

    subject(抽象主题角色):真实主题与代理主题的共同接口。

    RealSubject(真实主题角色):定义了代理角色所代表的真实对象。

    Proxy(代理主题角色):含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真实主题对象之前或者之后执行某些操作,而不是单纯返回某个对象。

    4.代码演示

    • 简单代理
    package test.com.proxy;
    /*
     * subject(抽象主题角色)
     * 真实主题与代理主题的共同接口
     */
    public interface Subject {
        public void sailBook();
    }
    package test.com.proxy;
    /*
     * RealSubject(真实主题角色)
     * 定义了代理角色所代表的真实对象
     */
    public class RealSubject implements Subject {
        @Override
        public void sailBook() {
            System.out.println("卖书");
        }
    }
    package test.com.proxy;
    /*
     * Proxy(代理主题角色)
     * 含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真实主题对象
     * 之前或者之后执行某些操作,而不是单纯返回某个对象
     */
    public class ProxySubject implements Subject {
        private RealSubject realSubject;
        
        @Override
        public void sailBook() {
            dazhe();
            if(this.realSubject == null) {
                realSubject = new RealSubject();
            }
            this.realSubject.sailBook();
            give();
        }
        
        
        public void dazhe() {
            System.out.println("打折");
        }
        
        public void give() {
            System.out.println("赠送优惠券");
        }
    }
    package test.com.proxy;
    /*
     *测试代码
     */
    public class MainClass {
        public static void main(String[] args) {
            ProxySubject proxySubject = new ProxySubject();
            proxySubject.sailBook();
            //打折
            //卖书
            //赠送优惠券
        }
    }
    • 动态代理
    package test.com.proxy;
    /*
     * subject(抽象主题角色)
     * 真实主题与代理主题的共同接口
     */
    public interface Subject {
        public void sailBook();
    }
    package test.com.proxy;
    /*
     * RealSubject(真实主题角色)
     * 定义了代理角色所代表的真实对象
     */
    public class RealSubject implements Subject {
        @Override
        public void sailBook() {
            System.out.println("卖书");
        }
    }
    package test.com.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    /*
     * MyHandler 代理实例
     * InvocationHandler 是代理实例的 调用处理程序 实现的接口
     */
    public class MyHandler implements InvocationHandler {
        private RealSubject realSubject;
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) {
            Object object = null;
            dazhe();
            if(realSubject == null) {
                realSubject = new RealSubject();
            }
            try {
                method.invoke(realSubject, args);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            give();
            return object;
        }
        
        public void dazhe() {
            System.out.println("打折");
        }
        
        public void give() {
            System.out.println("赠送优惠券");
        }
    }
    package test.com.proxy1;
    
    import java.lang.reflect.Proxy;
    /*
     * 测试代码
     */
    public class MainClass {
        public static void main(String[] args) {
            RealSubject realSubject = new RealSubject();
            MyHandler myHandler = new MyHandler();
            Subject sub = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), myHandler);
            sub.sailBook();
            //打折
            //卖书
            //赠送优惠券
        }
    }
  • 相关阅读:
    JavaScript 深入之从原型到原型链
    js重写内置的call、apply、bind
    js中flat方法的实现原理
    【我的物联网成长记6】由浅入深了解NB-IoT【华为云技术分享】
    GO富集分析示例【华为云技术分享】
    华为“方舟编译器”到底是啥?一文看懂TA如何让手机性能再突破【华为云技术分享】
    无码系列-7-代码的语文修养_上篇【华为云技术分享】
    机器学习笔记(一)----基本概念【华为云技术分享】
    性能达到原生 MySQL 七倍,华为云 Taurus 技术解读【华为云技术分享】
    【立即报名】人脸情绪识别案例分享【华为云技术分享】
  • 原文地址:https://www.cnblogs.com/zheaven/p/9989706.html
Copyright © 2020-2023  润新知