zoukankan      html  css  js  c++  java
  • java动态代理和静态代理

    代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。

    她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人。

     静态代理

    我们平常去电影院看电影的时候,在电影开始的阶段是不是经常会放广告呢?

    电影是电影公司委托给影院进行播放的,但是影院可以在播放电影的时候,产生一些自己的经济收益,比如卖爆米花、可乐等,然后在影片开始结束时播放一些广告。

    现在用代码来进行模拟。

    首先得有一个接口,通用的接口是代理模式实现的基础。这个接口我们命名为 Movie,代表电影播放的能力。

    package com.example.demo.user.controller;
    
    /**
     * @author liubh
     * @date 2021/1/7 9:44
     **/
    public interface Movie {
        void play();
    }

    目标对象实现接口

    package com.example.demo.user.controller;
    
    /**
     * @author liubh
     * @date 2021/1/7 9:44
     **/
    public class MovieImpl implements Movie {
        @Override
        public void play() {
            System.out.println(演电影);
        }
    }

    代理类

    package com.example.demo.user.controller;
    
    /**
     * @author liubh
     * @date 2021/1/7 12:24
     **/
    public class StaticMovieProxy implements Movie{
        private Movie movie;
    
        public StaticMovieProxy(Movie movie) {
            this.movie = movie;
        }
    
        @Override
        public void play() {
            System.out.println("卖爆米花");
            movie.play();
            System.out.println("退场");
    
        }
    }

    测试类

      public static void main(String[] args) {
            StaticMovieProxy proxy=new StaticMovieProxy(new MovieImpl());
            proxy.play();
        }

    动态代理

    package com.example.demo.user.controller;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * @author liubh
     * @date 2021/1/7 9:45
     **/
    public class DynamicPoxy implements InvocationHandler {
        private Object movie;
    
        public DynamicPoxy(Movie movie) {
            this.movie = movie;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("卖爆米花");
            method.invoke(movie);
            System.out.println("退场");
            return null;
        }
    }
     public static void main(String[] args) {
            Movie o = (Movie) Proxy.newProxyInstance(MovieImpl.class.getClassLoader(), MovieImpl.class.getInterfaces(), new DynamicPoxy(new MovieImpl()));
            o.play();
        }

     

  • 相关阅读:
    对json按某个键的值进行排序(转载)
    nrm -- NPM registry 管理工具
    easyui-filebox 文件上传
    Netty,Thrifty
    VS2015 framework4.5代码提示英文切换为中文
    .NET Runtime version 2.0.50727.8762
    js moment.js日期操作类 datetime,日期操作,dayjs
    Oracle.ManagedDataAccess.dll
    打造自己的JavaScript武器库(转)
    Vue.js实战 5.5章 购物车
  • 原文地址:https://www.cnblogs.com/liubaihui/p/14245810.html
Copyright © 2011-2022 走看看