码迷,mamicode.com
首页 > 其他好文 > 详细

代理模式

时间:2020-05-30 22:14:39      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:cat   val   instance   project   sys   string   代理类   ring   stat   

1. 代理模式:
静态代理
动态代理

package project05;
/*


静态代理:让【代理类】替【被代理类】完成一些“非业务”代码,核心代码还是【被代理者】自己完成

代理模式
1.主题接口
2.被代理类
3.代理类

例如:所有方法都增加一个功能:统计运行时间
*/

public class test01 {
    public static void main(String[] args) {
        
        //1.创建被代理对象
        UserDaoImpl u=new UserDaoImpl();

        //2.创建代理对象
        UserDaoProxy udp =new UserDaoProxy(u);
        
        
        udp.insert();
        
        
    }

}

//1.主题接口
interface UserDao{
    void insert();
    void delete();
    void update();
    void select();
}
//2.被代理类
class UserDaoImpl implements UserDao{
    @Override
    public void insert(){
        System.out.println("添加用户");

    }
    
    @Override
    public void delete() {
        System.out.println("删除用户");
    }
    
    @Override
    public void update() {
        System.out.println("更新用户");
    }
    
    @Override
    public void select() {
        System.out.println("查找用户");
    }
}
//3.代理类
class UserDaoProxy implements UserDao{
    private UserDao target;
    
    public UserDaoProxy(UserDao target) {
        super();
        this.target = target;
    }

    @Override
    public void insert(){
        long start=System.currentTimeMillis();
        System.out.println("开始执行insert方法");
        
        //执行真正的代码
        target.insert();
        
        long end=System.currentTimeMillis();
        System.out.println("结束执行insert方法");
        System.out.println("耗时:"+(end-start));

    }
    
    @Override
    public void delete() {
        long start=System.currentTimeMillis();
        System.out.println("开始执行delete方法");
        
        //执行真正的代码
        target.delete();
        
        long end=System.currentTimeMillis();
        System.out.println("结束执行delete方法");
        System.out.println("耗时:"+(end-start));
    }
    
    @Override
    public void update() {
        long start=System.currentTimeMillis();
        System.out.println("开始执行update方法");
        
        //执行真正的代码
        target.update();
        
        long end=System.currentTimeMillis();
        System.out.println("结束执行update方法");
        System.out.println("耗时:"+(end-start));
    }
    
    @Override
    public void select() {
        long start=System.currentTimeMillis();
        System.out.println("开始执行select方法");
        
        //执行真正的代码
        target.select();
        
        long end=System.currentTimeMillis();
        System.out.println("结束执行select方法");
        System.out.println("耗时:"+(end-start));
    }
}
package project05;

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

/*




动态代理模式
1.主题接口
2.被代理类
3.代理工作处理器 InvocationHandler
    参数列表: 
        proxy:代理类对象 
        method:代理类要执行的真正方法
        args:给method实参列表
    返回值:method返回值就是invoke的返回值
4.代理类 Proxy
          参数列表:
          loader:类加载器
          interfaces:被代理者的接口
          h:代理工具处理器对象
     


例如:所有方法都增加一个功能:统计运行时间
*/

public class test02 {
    public static void main(String[] args) {

        System.out.println("ok");

        
          //1.创建被代理对象 
        UserDaoImpl u=new UserDaoImpl();
          
          //2.获取被代理者的类加载器对象 
        ClassLoader loader = u.getClass().getClassLoader();
          
          //3.获取被代理者的接口们 
        Class<?>[] interfaces = u.getClass().getInterfaces();
          
          //4.创建处理器对象
        Handler h= new Handler(u);
          
          //5.动态创建代理类和对象:在内存自动生成
        UserDao ud = (UserDao)Proxy.newProxyInstance(loader,interfaces, h);
          
        ud.insert();
         

    }

}

//1.主题接口
interface UserDao {
    void insert();

    void delete();

    void update();

    void select();
}

//2.被代理类
class UserDaoImpl implements UserDao {
    @Override
    public void insert() {
        System.out.println("添加用户");

    }

    @Override
    public void delete() {
        System.out.println("删除用户");
    }

    @Override
    public void update() {
        System.out.println("更新用户");
    }

    @Override
    public void select() {
        System.out.println("查找用户");
    }
}

//3.代理工作处理器
class Handler implements InvocationHandler {

    private Object target;

    public Handler(Object target) {
        super();
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        long start = System.currentTimeMillis();
        System.out.println("开始执行" + method.getName() + "方法");

        // 执行真正的代码
        Object value = method.invoke(target, args);

        long end = System.currentTimeMillis();
        System.out.println("结束执行" + method.getName() + "方法");
        System.out.println("耗时:" + (end - start));

        return value;
    }

}

 

代理模式

标签:cat   val   instance   project   sys   string   代理类   ring   stat   

原文地址:https://www.cnblogs.com/hapyygril/p/12994849.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!