代理模式(Proxy)

来源:互联网 发布:知乎 知乎日报 区别 编辑:程序博客网 时间:2024/04/29 01:14

 定义: 为其他对象提供一种代理以控制对这个对象的访问

(1)静态代理:

 

package com.eshore.zzy.design.pattern.proxy.staticproxy;

public interface Subject {
  public void sayHello(String name);
 }

package com.eshore.zzy.design.pattern.proxy.staticproxy;

public class SourceSubject implements Subject{
 public void sayHello(String name){
  System.out.println("Hello "+name);
  }
 }

 

package com.eshore.zzy.design.pattern.proxy.staticproxy;
/**
 * 静态代理的类要和被代理的类实现同一个接口,实质是用到原类的方法
 * @author zhouziyu
 *
 */
public class ProxySubject implements Subject{
 private SourceSubject ss;

 public void sayHello(String name) {
  if (ss == null) {
   ss = new SourceSubject();
  }
  ss.sayHello(name);
  System.out.println("静态代理调用");
  }
 }

 package com.eshore.zzy.design.pattern.proxy.staticproxy;

public class Test {
 public static void main(String args[]) {
        Subject sb = new SourceSubject();
        sb.sayHello("zhouziyu");
        sb = new ProxySubject();
        sb.sayHello("zhouziyu");
 }

}

(2)动态代理:

package com.eshore.zzy.design.pattern.proxy.dynamicproxy;

public interface Subject {
 public void sayHello(String name);
 }

 package com.eshore.zzy.design.pattern.proxy.dynamicproxy;

public class SourceSubject implements Subject{
 public void sayHello(String name){
  System.out.println("Hello "+name);
  }
 }

 package com.eshore.zzy.design.pattern.proxy.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 动态代理要实现java.lang.reflect.InvocationHandler接口
 *
 * @author zhouziyu
 *
 */
public class ProxySubject implements InvocationHandler {
 private Object obj;

 public ProxySubject(Object obj) {
  this.obj = obj;
  }

 /**
  * 方法的三个参数分别是,代理的原对象,方法,及对应的参数
  */
 public Object invoke(Object target, Method method, Object[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
      System.out.println("代理方法之前"+method.getName());
      if(method.getName().equals("sayHello")){
     System.out.println("hahahaha");
      }else{
      method.invoke(obj, args);
      }System.out.println("代理方法完成"+method.getName());
      return null;
  }
 }

package com.eshore.zzy.design.pattern.proxy.dynamicproxy;

import java.lang.reflect.Proxy;
/**
 * 定义:为其他对象提供一种代理以控制对这个对象的访问
 * 前提:在不改变接口的情况下
 * @author zhouziyu
 *
 */
public class Test {
 public static void main(String args[]) {
  Subject sub = new SourceSubject();
  //动态代理的关键所在,三个参数分别是类加载器,接口,和InvocationHandler
  sub = (Subject) Proxy.newProxyInstance(sub.getClass().getClassLoader(),
    sub.getClass().getInterfaces(), new ProxySubject(sub));
  sub.sayHello("zhouziyu");
  }
 }


 

原创粉丝点击