zoukankan      html  css  js  c++  java
  • 第九讲、代理模式

    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();
            //打折
            //卖书
            //赠送优惠券
        }
    }
  • 相关阅读:
    JTS相关资料和示例
    微信、支付宝支付那点事
    系统化全方位监控告警,这一篇足矣
    耶鲁大学研究创造了模拟人类认知的计算机芯片
    Docker孵化的5个开源项目
    图解数据中心水系统标准和架构(大全)
    React Native 项目整合 CodePush 全然指南
    1分钟了解MyISAM与InnoDB的索引差异
    Google I/O 官方应用中的动效设计
    为了完毕月入三万的目标,我都做了哪些准备?
  • 原文地址:https://www.cnblogs.com/zheaven/p/9989706.html
Copyright © 2011-2022 走看看