zoukankan      html  css  js  c++  java
  • 代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
    这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法

    一.静态代理

    interface IUserDao {
        void save();
    }
    class UserDao implements IUserDao {
        public void save() {
            System.out.println("----已经保存数据!----");
        }
    }
    
    class UserDaoProxy implements IUserDao{
        //接收保存目标对象
        private IUserDao target;
        public UserDaoProxy(IUserDao target){
            this.target=target;
        }
    
        public void save() {
            System.out.println("开始事务...");
            target.save();//执行目标对象的方法
            System.out.println("提交事务...");
        }
    }
    View Code

    静态代理总结:
    1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
    2.缺点:

    • 因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.

    如何解决静态代理中的缺点呢?答案是可以使用动态代理方式

    二.动态代理

    interface Subject
    {
        void doSomething();
    }
    
    class RealSubject implements Subject
    {
         public void doSomething()   
          {   
            System.out.println( "call doSomething()" );   
          } 
    }
    class ProxyHandler  implements InvocationHandler
    {
        private Object proxied;  
        ProxyHandler(Object proxied)
        {
            this.proxied=proxied;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // TODO Auto-generated method stub
            System.out.println( "call do otherthing()" );  
            return method.invoke(proxied, args);        
        }
        
    }
    
    public class AppDomain {
        public static void main(String[] args)
        {
            RealSubject real = new RealSubject();  
            Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(), 
                     new Class[]{Subject.class}, 
                     new ProxyHandler(real));
            proxySubject.doSomething();    
        }
    }
    View Code

    总结

    一个典型的动态代理创建对象过程可分为以下四个步骤:
    1、通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);
    2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类
    Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
    3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型
    Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
    4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入
    Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
    为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。
    生成的ProxySubject继承Proxy类实现Subject接口,实现的Subject的方法实际调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的的方法(Object result=method.invoke(proxied,args))

  • 相关阅读:
    python基础知识(集合)
    python基础知识(字典)
    python基础知识(循环语句)
    Python基础知识(程序结构)
    python基础知识(正则表达式)
    python基础知识(字符串)
    jmeer_09_JDBC Request
    性能总结_01
    性能02_
    jmeter_07正则提取器_JDBC_Connection_Configuration
  • 原文地址:https://www.cnblogs.com/liandy0906/p/7269703.html
Copyright © 2011-2022 走看看