JAVA_动态代理设计模式

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-23 19:54   29   0

动态代理

动态代理模式与策略模式的区别

1、策略模式:在项目中适用于 实现同一个目标但是有很多不同的做法的情况,

比如实现数据库里面的搜索,可能算法、方式很多,但是目的差不多。这时候可以使用策略模式

2、代理模式:主要针对对象的访问控制,比如在hibernate的懒加载中,不希望页面直接访问dao层的数据。

这时候给页面开放一个Proxy。

例子:

1、首先定义个接口

public interface Subject {
      public String init();
}

2、实现接口的实现类

--------------------------第一个实现类-----------------------------------------------

public class RealOneSubject implements Subject {
    private String id= "127.0.0.1";
      public String init() {
            return id;
      }
}

--------------------------第二个实现类-----------------------------------------------

public class RealTwoSubject implements Subject{
      private String id = "18518175440";
      @Override
      public String init() {
            // TODO Auto-generated method stub
            return id;
      }
}

3、创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法

public class DynamicProxy implements InvocationHandler{
      private Object object;
    public DynamicProxy(Object object) {
        this.object = object;
    }
      @Override
      public Object invoke(Object proxy, Method method, Object[] args)
                  throws Throwable {
            // TODO Auto-generated method stub
            Object result = method.invoke(object, args);
        return result;
      }
}

4、客服端测试

import java.lang.reflect.Proxy;
public class test {
      public static void main(String[] args) {
            Subject one = new RealOneSubject();
            Subject two = new RealTwoSubject();
            //执行RealOneSubject实现类中的方法
            DynamicProxy proxy = new DynamicProxy(one);
            ClassLoader classLoader = one.getClass().getClassLoader();
            Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new  Class[]{Subject.class}, proxy);
            String init = subject.init();
            System.out.println("执行RealOneSubject实现类中的方法---"+init);
            //执行RealTwoSubject实现类中的方法
            DynamicProxy proxy1 = new DynamicProxy(two);
            ClassLoader classLoader1 = two.getClass().getClassLoader();
            Subject subject1 = (Subject) Proxy.newProxyInstance(classLoader1, new  Class[]{Subject.class}, proxy1);
            String init1 = subject1.init();
            System.out.println("执行RealTwoSubject实现类中的方法---"+init1);
      }
}

效果:

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP