• java设计模式----代理模式


    目录

        1.代理模式

      2.静态代理

      3.动态代理

    一、代理模式

      核心作用:

        通过代理,控制对对象的访问,

        代理可以详细控制对某个或某类对象的方法,在调用这个方法之前或之后做事

        ps:代理模式是AOP(面向切面编程)的核心实现机制

      

      应用场景:

        --安全代理:屏蔽对真实角色的直接访问

        --远程代理:通过代理类处理远程方法调用

        --延迟代理:先加载轻量级的代理对象,真正需要再加载真实对象

      

      分类:

        --静态代理:自己定义代理类

        --动态代理:程序动态生成代理类

          1.JDK自带的动态代理

          2.javaassist字节码操作库

          3.CGLIB

          4.ASM(底层使用命令,可维护行差)

    二、静态代理

      模型:

    实现:

      接口:

    package com.demo.proxy.staticproxy;
    
    /**
     * 明星接口
     * @author HYSong
     *
     */
    public interface Star {
        /**
         * 面谈
         */
        void confer();
        /**
         * 签合同
         */
        void signContract();
        /**
         * 订票
         */
        void bookTicket();
        /**
         * 唱歌
         */
        void sing();
        /**
         * 收尾款
         */
        void collectMoney();
    }
    Star

      真实类:

    package com.demo.proxy.staticproxy;
    
    /**
     * 真实类(明星能做的都能做)
     * @author HYSong
     *
     */
    public class RealStar implements Star{
    
        @Override
        public void confer() {
            System.out.println("RealStar.confer()");
        }
    
        @Override
        public void signContract() {
            System.out.println("RealStar.signContract()");
        }
    
        @Override
        public void bookTicket() {
            System.out.println("RealStar.bookTicket()");
        }
    
        @Override
        public void sing() {
            System.out.println("RealStar.sing()");
        }
    
        @Override
        public void collectMoney() {
            System.out.println("RealStar.collectMoney()");
        }
        
    }
    RealStar

      代理类:

    package com.demo.proxy.staticproxy;
    
    /**
     * 代理类(唯独不会唱歌)
     * @author HYSong
     *
     */
    public class ProxyStar implements Star{
    
        private Star star;
        public ProxyStar(Star star) {
            this.star = star;
        }
        @Override
        public void confer() {
            System.out.println("ProxyStar.confer()");
        }
    
        @Override
        public void signContract() {
            System.out.println("ProxyStar.signContract()");
        }
    
        @Override
        public void bookTicket() {
            System.out.println("ProxyStar.bookTicket()");
        }
    
        @Override
        public void sing() {
            star.sing();
        }
    
        @Override
        public void collectMoney() {
            System.out.println("ProxyStar.collectMoney()");
        }
        
    }
    ProxyStar

      客户调用:

    package com.demo.proxy.staticproxy;
    
    /**
     * 客户只与经济人相关
     * @author HYSong
     *
     */
    public class Client {
        public static void main(String[] args) {
    //          真实对象
             Star real = new RealStar();
    //          代理对象
             Star proxy = new ProxyStar(real);
             proxy.confer();
             proxy.signContract();
             proxy.bookTicket();
             proxy.sing();
             proxy.collectMoney();
        }
    }
    Client

    三、动态代理

      这里的动态代理我们是用jdk自带的一种动态代理

      --java.lang.reflect.Proxy

        动态生成代理类和对象

      --java.lang.reflect.InvocationHandler(处理器接口)

        可以通过invoke方法实现对真实角色的代理访问

        每次通过proxy生成代理类对象,对象都要指定对应的处理器对象

    实现:

      

    package com.demo.proxy.dynamicproxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class StarHandler implements InvocationHandler{
    
        private Star realStar ; 
        public StarHandler(Star realStar) {
            this.realStar = realStar;
        }
        /**
         * 只要调用代理类的方法,所有方法全都会在这个方法中来执行
         * 所有流程控制都在这个方法里面
         * @param proxy 代理类
         * @param method 正在调用的方法
         * @param args 方法的参数
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("我是代理");
            System.out.println("面谈、签合同、预付款、订机票");
            //        激活方法(反射)
            if(method.getName().equals("sing")) {            
                method.invoke(realStar, args);
            }
            System.out.println("收尾款");
            return null;
        }
    
    }
    StarHandler
    package com.demo.proxy.dynamicproxy;
    
    import java.lang.reflect.Proxy;
    
    public class Client {
    
        public static void main(String[] args) {
    //        需要被代理的对象
            Star realStar = new RealStar();
    //        创建一个处理对象
            StarHandler starHandler = new StarHandler(realStar);
    //        创建一个代理类对象
            Star proxyStar= (Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
                    new Class[] {Star.class}, starHandler);
            proxyStar.sing();
        }
    
    }
    client
  • 相关阅读:
    iOS开发多线程篇—GCD介绍
    IOS UI篇—UILabel的文字顶部对齐
    TableView编辑中实现多行删除的2中方法以及注意
    UITableView的新手——层次注意
    UITabBarItem编写的时候出现得图片显示异常,和有一些比较忽略的方法总结
    在ios开发中nil和NUll和Nilde区别————和如何判断连个对象的关系和UISlider不能拖动的问题
    iphone 手机屏幕和UIView和UIWindowde 的主要的区别
    iOS平常注意1
    ios优化复制大文件时,如何使内存运用最少且效率最高
    property在括号中应该怎样写
  • 原文地址:https://www.cnblogs.com/bananafish/p/10342186.html
Copyright © 2020-2023  润新知