设计模式原来如此-代理模式的实际应用

下面通过一个项目中经常用到的功能来举下动态代理是实例,实例有2个功能:1是记录用户登录的日志。2是计算一下添加算法的时间。为了简单起见,2个功能忽略了详细算法。如果使用静态代理就得建2个代理类,分别做这2个功能,如果功能很多,就要建立很多类。使用动态代理的好处就是建立一个类就可以搞定。

用户登录

package com.zhouyu.myProxy;

public interface UserDao
{
    public boolean login(String username,String password);
}

package com.zhouyu.myProxy;

public class UserDaoImpl implements UserDao
{
    @Override
    public boolean login(String username, String password)
    {
        if("zy".equals(username) && "1234".equals(password))
        {
            return true;
        }
        return false;
    }
}

动态代理类,2个功能的代理都放在这里

package com.zhouyu.myProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;

public class MyProxy implements InvocationHandler
{
    private Object object;

    public MyProxy(Object object)
    {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {
        if("login".equals(method.getName()) && "zy".equals(args[0]) && "1234".equals(args[1]))
        {
            System.out.println("Log i :" +args[0] + "用户登录成功 " + new Date());
        }
        Object result = method.invoke(object,args);
        return result;
    }
}



客户端调用

package com.zhouyu.myProxy;

import java.lang.reflect.InvocationHandler;

public class Client
{
    public static void main(String[] args)
    {
        UserDao ud = new UserDaoImpl();
        InvocationHandler proxy = new MyProxy(ud);

        ClassLoader classLoader = ud.getClass().getClassLoader();

        UserDao dao = (UserDao) java.lang.reflect.Proxy.newProxyInstance(classLoader, new Class[]{UserDao.class}, proxy);

        boolean bl = dao.login("zy","1234");
        System.out.println(bl);
    }
}

这个功能就是使用动态代理记录zy用户的登录的时间。如果用户名和密码正确,运行结果为:

Log i :zy用户登录成功 Wed Jul 10 10:35:45 CST 2013
true

如果用户名或密码错误,运行结果为
false

下面代码是计算一下添加算法的时间

package com.zhouyu.myProxy;

public interface MakeDao
{
    public void save(String str) throws InterruptedException;
}

package com.zhouyu.myProxy;

import java.util.Random;

public class MakeDaoImpl implements MakeDao
{
    @Override
    public void save(String str)
    {
        System.out.println(str + " 添加成功");
        
        //模拟了该算法的运行时间
        try
        {
            Thread.sleep(new Random().nextInt(100));
        }
        catch (Exception e)
        {
            System.out.println(e.toString());
        }
    }
}



还是刚才那个代理类,添加了一些代码

package com.zhouyu.myProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;

public class MyProxy implements InvocationHandler
{
    private Object object;

    public MyProxy(Object object)
    {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {
        if("login".equals(method.getName()) && "zy".equals(args[0]) && "1234".equals(args[1]))
        {
            System.out.println("Log i :" +args[0] + "用户登录成功 " + new Date());
        }
        long start = 0;
        long end = 0;
        if("save".equals(method.getName()))
        {
            start = System.currentTimeMillis();
        }
        Object result = method.invoke(object,args);
        if("save".equals(method.getName()))
        {
            end = System.currentTimeMillis();
            System.out.println("运行时间为:" + (end - start));
        }

        return result;
    }
}

客户端调用

package com.zhouyu.myProxy;

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

public class MakeAction
{
    public static void main(String[] args) throws Exception
    {
        MakeDao md = new MakeDaoImpl();
        InvocationHandler h = new MyProxy(md);

        ClassLoader classLoader = md.getClass().getClassLoader();
        MakeDao make = (MakeDao) Proxy.newProxyInstance(classLoader,new Class[]{MakeDao.class},h);
        make.save("abc");
        make.save("def");
    }
}

运行结果为

abc 添加成功
运行时间为:93
def 添加成功
运行时间为:80


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值