zoukankan      html  css  js  c++  java
  • 动态代理技术实现设计模式-代理模式

    什么时候可以使用代理模式?

      需要在原有功能的基础上神不知鬼不觉的增加一些额外功能时,使用代理模式.

    如何实现?

    1,接口定义

    package kooko.com.proxy;
    
    public interface HelloWorld {
        public void sayHelloWorld();
        public void sayBye();
    }

    2,接口实现

    package kooko.com.proxy;
    
    public class HelloWorldImpl implements HelloWorld{
    
        public void sayHelloWorld(){
            System.out.println("say hello");
        }
        
        public void sayBye(){
            System.out.println("say bye");
        }
    }

    3,代理功能类实现

    package kooko.com.proxy.handler;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import kooko.com.proxy.HelloWorld;
    import kooko.com.proxy.HelloWorldImpl;
    
    /**
     * 动态代理
     * 实现给某个接口实现类的前后加上日志输出
     * @author lxz
     *
     */
    public class HelloWorldHandler implements InvocationHandler{
        private Object obj;//要代理的原始对象
    
        public HelloWorldHandler(Object obj){
            super();
            this.obj = obj;
        }
        public HelloWorldHandler(){
            super();
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Object result = null;
            doBefore();
            //
            result = method.invoke(obj, args);
            doAfter();
            return result;
        }
        
        private void doBefore(){
            System.out.println("before say hello");
        }
        
        private void doAfter(){
            System.out.println("after say hello");
        }
        
        public void setObject(Object xxx){
            this.obj=xxx;
        }
        
    }

    4,调用测试方法

        public static void main(String[] args){
    //        InvocationHandler handler = new HelloWorldHandler(new HelloWorldImpl());
            HelloWorldHandler xxxx= new HelloWorldHandler();
            xxxx.setObject(new HelloWorldImpl());
            InvocationHandler handler = xxxx;
            //这里需要类加载器
            HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(new HelloWorldHandler().getClass().getClassLoader()
                    , new HelloWorldImpl().getClass().getInterfaces(), handler);
            proxy.sayHelloWorld();
            proxy.sayBye();
            
            //什么时候可以使用呢
            //封装一个代理服务类,当需要调用方法的前后做一些事情的时候,利用代理服务类来生成对象就可以了
        }
  • 相关阅读:
    markdown基础使用技巧
    用ps实现提高照片的清晰度
    正则表达式匹配:中、日、韩文
    解决"$ is not defined" 亲自体验
    [NLP] 相对位置编码(一) Relative Position Representatitons (RPR)
    [NLP] cs224n-2019 Assignment 1 Exploring Word Vectors
    [Deep Learning] GELU (Gaussian Error Linerar Units)
    [Python] 等号赋值, copy, deepcopy的区别
    [微积分] 利用极坐标计算二重积分
    [c++] C++多态(虚函数和虚继承)
  • 原文地址:https://www.cnblogs.com/qinggege/p/5091612.html
Copyright © 2011-2022 走看看