设计模式之代理模式

Posted zbb2161228

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之代理模式相关的知识,希望对你有一定的参考价值。

学习过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:代理模式应该算是最简单的设计模式了。。。

以上是关于设计模式之代理模式的主要内容,如果未能解决你的问题,请参考以下文章

Spring之代理模式

#yyds干货盘点# 设计模式之代理模式:动态代理

设计模式之代理模式(Proxy)详解及代码示例

代理模式之静态代理实现代码

设计模式之代理模式

设计模式之代理模式