Java代理

     代理模式,是GOF中的一种;此模式中主要有client(调用者),proxy(代理),delegate(原对象、委托对象);client不是对delegate发请求,而是对proxy发请求,proxy内部将责任委托给delegate。一般proxy将一些复杂的操作封装起来,使client可以透明地调用delegate的方法,而无须知道proxy内部的实现细节。

    

     代理模式常见的用法有:远程调用代理(如RMI)、虚代理、计数代理等等。

 

     例如:计数代理

              public interface IOrderManager {

                   void addOrder(Order order);

              }

 

              public class OrderManagerImp implements IOrderManager {

                    public void addOrder(Order order) {

                           // some operation

                    }

              }

 

              public class CountProxy implements IOrderManager {

                   private IOrderManager orderManager;

                   private int count = 0;

                  

                   public CountProxy(IOrderManager orderManager) {

                         this.orderManager = orderManager;

                   }

 

                   public void addOrder(Order order)  {

                        count++;

                        orderManager.addOrder(order);

                   }

              }

             

              public class TestCountProxy {

                  public static void main(String args[]) {

                       // 一些操作,用于注册一些类

                       /*

                            比如:

                            IOrderManager orderMgr = new OrderManagerImp();

                            CountProxy proxy = new CountProxy(orderMgr);

                            Registry.regOrderManager(proxy);

                        */

                       IOrderManager orderManager = Registry.getOrderManager();

                       orderManager.addOrder(...);

                  }

              }

 

 

 在Java中有一种方便的方式实现代理,代码如下:

  public class DynamicProxy {

     public static Object wrapper(Object delegate) {

        return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),

                                                           delegate.getClass().getInterfaces(),

                                                           new DynamicProxyHandler(delegate));

    }

  }

 

  public class DynamicProxyHandler {

      private final Object delegate; //防止被第二次赋值

     

      public DynamicProxyHandler(Object delegate) {

          this.delegate = delegate;

     }

 

     public Object invoke(Object proxy, Method method, Object[] args) {

         // do something

         Object ret = null;

         try {

            ret = method.invoke(delegate, args);  //调用原方法

         } catch (Throwable e) {

                e.printStackTrace();

         }

         // do something

        return ret;

    }

  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java代理模式是一种结构型设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。代理对象可以在客户端和目标对象之间充当中介,以便于客户端访问目标对象时,可以在不改变目标对象的情况下添加一些额外的功能,比如安全性、远程访问、缓存等。 在Java中,代理模式可以通过两种方式实现:静态代理和动态代理。静态代理需要手动编写代理类,而动态代理可以在运行时通过反射机制动态生成代理类,更加灵活。 举个例子,假设我们有一个接口`Subject`,其中定义了一些方法。我们希望在调用这些方法时,增加一些额外的日志记录功能。我们可以编写一个代理类`SubjectProxy`,在代理类中实现接口方法并调用目标对象的方法,同时在方法前后添加日志记录的代码。客户端则通过代理类访问目标对象。 静态代理示例代码如下: ```java public interface Subject { void doSomething(); } public class RealSubject implements Subject { @Override public void doSomething() { System.out.println("RealSubject do something."); } } public class SubjectProxy implements Subject { private Subject realSubject; public SubjectProxy(Subject realSubject) { this.realSubject = realSubject; } @Override public void doSomething() { System.out.println("Before do something."); realSubject.doSomething(); System.out.println("After do something."); } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); Subject subjectProxy = new SubjectProxy(realSubject); subjectProxy.doSomething(); } } ``` 动态代理示例代码如下: ```java public class SubjectHandler implements InvocationHandler { private Object target; public SubjectHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before " + method.getName()); Object result = method.invoke(target, args); System.out.println("After " + method.getName()); return result; } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); InvocationHandler handler = new SubjectHandler(realSubject); Subject subjectProxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler); subjectProxy.doSomething(); } } ``` 无论是静态代理还是动态代理代理模式都可以在不改变目标对象的情况下,为其添加额外的功能,提高代码的可复用性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值