美文网首页
代理模式

代理模式

作者: d9610fcd3279 | 来源:发表于2019-03-24 17:42 被阅读0次

    静态代理

    public interface ISinger {
     2     void sing();
     3 }
     4 
     5 /**
     6  *  目标对象实现了某一接口
     7  */
     8 public class Singer implements ISinger{
     9     public void sing(){
    10         System.out.println("唱一首歌");
    11     }  
    12 }
    13 
    14 /**
    15  *  代理对象和目标对象实现相同的接口
    16  */
    17 public class SingerProxy implements ISinger{
    18     // 接收目标对象,以便调用sing方法
    19     private ISinger target;
    20     public UserDaoProxy(ISinger target){
    21         this.target=target;
    22     }
    23     // 对目标对象的sing方法进行功能扩展
    24     public void sing() {
    25         System.out.println("向观众问好");
    26         target.sing();
    27         System.out.println("谢谢大家");
    28     }
    29 }
    
    /**
     2  * 测试类
     3  */
     4 public class Test {
     5     public static void main(String[] args) {
     6         //目标对象
     7         ISinger target = new Singer();
     8         //代理对象
     9         ISinger proxy = new SingerProxy(target);
    10         //执行的是代理的方法
    11         proxy.sing();
    12     }
    13 }
    

    动态代理

    public interface ISinger {
     2     void sing();
     3 }
     4 
     5 /**
     6  *  目标对象实现了某一接口
     7  */
     8 public class Singer implements ISinger{
     9     public void sing(){
    10         System.out.println("唱一首歌");
    11     }  
    12 }
    
    

    这回直接上测试,由于java底层封装了实现细节(之后会详细讲),所以代码非常简单,格式也基本上固定。

    调用Proxy类的静态方法newProxyInstance即可,该方法会返回代理类对象

    static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
    接收的三个参数依次为:

    ClassLoader loader:指定当前目标对象使用类加载器,写法固定
    Class<?>[] interfaces:目标对象实现的接口的类型,写法固定
    InvocationHandler h:事件处理接口,需传入一个实现类,一般直接使用匿名内部类

    public class Test{
     2     public static void main(String[] args) {
     3   Singer target = new Singer();
     4         ISinger proxy  = (ISinger) Proxy.newProxyInstance(
     5                 target.getClass().getClassLoader(),
     6                 target.getClass().getInterfaces(),
     7                 new InvocationHandler() {
     8                     @Override
     9                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    10                         System.out.println("向观众问好");
    11                         //执行目标对象方法
    12                         Object returnValue = method.invoke(target, args);
    13                         System.out.println("谢谢大家");
    14                         return returnValue;
    15                     }
    16                 });
    17         proxy.sing();
    18     }
    19 }
    

    相关文章

      网友评论

          本文标题:代理模式

          本文链接:https://www.haomeiwen.com/subject/nknuvqtx.html