首页 > 其他 > 详细

设计模式之代理模式

时间:2019-02-23 23:45:24      阅读:222      评论:0      收藏:0      [点我收藏+]

学习过Spring AOP后,对其实现的原理有了基本的了解,明白其核心是动态代理机制,通过匿名内部类方法对条件进行拦截,达到了切面编程的效果。

 

那么,怎么去解释代理模式呢?

这里仅简单介绍一下对动态模式的理解。 

借用《设计模式之禅》一书对代理模式的介绍,以网络游戏的打怪升级为例。一路上的打怪升级总是必不可少的,但伴随着玩家的也有枯燥、重复的操作,降低了游戏的趣味。这时游戏代练便出场了,把账号交给代练人员操作,由他们帮助我们升级打怪,看到自己经验不断上涨的同时还不用自己动手,岂不是美滋滋~~

可是,事情远没这么简单。当我们自己拥有该账号的时候,一般不会担心账号风险问题。但是一旦把账号交给了代练,就会增加许多不确定因素,比如账号信息泄露、非代理登录盗号等等,那这时,通过动态代理,在登录这个操作后,给我们发送一条登录回执,这样在登录后进行确认,就大大降低了对账号的担忧~~

 

伪代码如下 

首先定义一个游戏客户端:

 

public class Client {

    public static void main(String[] args) {

        //定义玩家
        GamePlayer gamePlayer = new GamePlayer("aaa");

        //定义一个handeler
        InvocationHandler handler = new GamePlayerProxy(gamePlayer);

        //获得类的ClassLoader
        ClassLoader cl = gamePlayer.getClass().getClassLoader();
        
        //动态产生代理者
        GamePlayer proxy = (GamePlayer) Proxy.newProxyInstance(cl,new Class[]{GamePlayer.class},handler);
        
        //登录,开始游戏
        proxy.login("username","password");
        proxy.play();
        proxy.upgrade();
        proxy.logout();
        
        //记录结束时间
        System.out.println("Game shutdown at " + System.currentTimeMillis());
        
    }
}

 

这是正常的游戏操作,那如何实现登录回执呢?

 

public class GamePlayerProxy implements InvocationHandler {

    //被代理者
    Class cls = null;

    //被代理的实例
    Object obj = null;

    //我代理谁


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

    //调用被代理的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(this.obj,args);

        //如果用户登录,则发送回执
        if (method.getName().equals("login")){
            System.out.println("The account is now log in where ip=xxx");
        }

        return result;
    }

}

 

这样,一个简单的动态代理就实现了,这实际也是AOP的切面编程思想,在主要开发阶段,不对日志、权限进行考量,在后期使用AOP进行切面编程,大大简化了产品设计~~

个人OS:代理模式应该算是最简单的设计模式了。。。

设计模式之代理模式

原文:https://www.cnblogs.com/zbb2161228/p/10424878.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!