设计模式---动态代理模式

动态代理模式:

    作用:在不改变源码的情况下,对现有的方法进行增强。
    
    代码演示;
    
    1.一个接口:
        public interface Printer {
            void print();
        }
        
    2.一个实现类:被增强类
        public class PrinterImpl implements Printer {
            public void print(){
                System.out.println("打印机打印。。。");
            }
        }
        
    3.目标代理类:实现InvocationHandler接口
        public class TargetProxy implements InvocationHandler {

            //被代理的对象
            private Object targetObject;


            /**
             *
             *   ClassLoader loader,  被代理类的类加载器
             *   Class<?>[] interfaces, 被代理类的所有接口
             *   InvocationHandler h  实现了InvocationHandler的类
             */
            public Object newProxyInstance(Object targetObject){
                this.targetObject=targetObject;
                return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                        targetObject.getClass().getInterfaces(),
                        this); //真正的代理类
            }
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("日志记录");
                // obj: 调用方法的对象
                // args: 方法的参数
                method.invoke(targetObject, args);


                System.out.println("日志保存");
                return null;
            }
        }
        
    4.测试
        public class ProxyTest {
            public static void main(String[] args) {
                TargetProxy targetProxy = new TargetProxy();
                Printer printer = (Printer)targetProxy.newProxyInstance(new PrinterImpl());
                printer.print();
            }
        }
        
        
        
        
        
        
        

    

 

posted @ 2020-04-22 18:37  moonlighter  阅读(125)  评论(0编辑  收藏  举报