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

设计模式(二)学习----动态代理

时间:2014-08-21 00:02:03      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   java   使用   os   io   strong   

动态代理:动态代理是指在实现阶段不需要关心代理谁,而在运行阶段才指定代理哪一个对象。Spring AOP采用的核心思想就是动态代理设计模式。

 下面看动态代理的UML类图:

    bubuko.com,布布扣

下面思考问题:invocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的?

动态代理类:

package com.lp.ecjtu.DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 动态代理类,代理玩游戏练级的代练者
 * @author Administrator
 *
 */
public class GamePlayerhandler implements InvocationHandler{
    //被代理对象,也就是目标对象
    private Object target;
    public GamePlayerhandler(Object realObject){
        this.target = realObject;
    }
    /**
     * 在目标对象的方法前面执行的业务员逻辑
     */
    public void beforeMethod(){
        System.out.println("***********业务逻辑before************");
    }
    /**
     * 在目标对象的执行的方法后执行的业务逻辑
     */
    public void afterMehod(){
        System.out.println("************业务逻辑after************");
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        beforeMethod();
        //执行目标对象的方法,也就是反射后真实类中的方法
        Object result = method.invoke(target, args);
        //为了防止盗号,如果想让游戏登陆后发个信息给我们,直接修改GamePlayerServiceImp?
        //不是好方法,可以在这个方法里面修改
        //被代理对象的方法名称等于login
        if(method.getName().equalsIgnoreCase("login")){
            System.out.println("有人在用你的账号登陆,请确认是否是本人!");
        }
        afterMehod();
        return result;
    }
}

目标类对象接口:(被代理类):

package com.lp.ecjtu.DynamicProxy;
/**
 * 目标对象实现的接口,用JDK来生成代理对象一定要实现一个接口 
 * @author Administrator
 *
 */
public interface IGamePlayerService {
    //代理对象将实现目标对象接口下面的所有方法
    //登陆游戏
    public void login(String user,String password);
    //杀怪
    public void killBoss();
    //升级
    public void upgrade();
}

 

目标实现类:

package com.lp.ecjtu.DynamicProxy;
/**
 * 
 * @author Administrator
 * 目标类,被代理的对象类
 */
public class GamePlayerServiceImp implements IGamePlayerService{
    private String playerName;
    public GamePlayerServiceImp(){
        
    }
    public GamePlayerServiceImp(String playerName){
        this.playerName = playerName;
    }
    @Override
    public void killBoss() {
        System.out.println("正在打怪中---------");
    }

    @Override
    public void login(String user, String password) {
        System.out.println("    陆游戏----------");
    }
    
    @Override
    public void upgrade() {
        System.out.println("打怪升级中--------");
    }

}

游戏客户端:

package com.lp.ecjtu.DynamicProxy;

import java.lang.reflect.Proxy;

public class GameClient {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //被代理对象的实例化,也可以说成目标对象的实例化
        IGamePlayerService realPlayer = new GamePlayerServiceImp("代练者张三");
        //实例化一个handler
        GamePlayerhandler handler = new GamePlayerhandler(realPlayer);
        //获得类的ClassLoader
        ClassLoader classloader = realPlayer.getClass().getClassLoader();
        //代理对象实现目标对象的接口,还可以使用new Class[]{IGamePlayerService.class}
        Class<?>[] interfaces = realPlayer.getClass().getInterfaces();
        //根据目标对象动态的生成一个代理者
        IGamePlayerService proxy = (IGamePlayerService) Proxy.newProxyInstance(
                classloader, 
                interfaces, 
                handler);
        //代练者登陆
        proxy.login("张三", "123");
        //打怪
        proxy.killBoss();
        //升级
        proxy.upgrade();
    }

}

 

设计模式(二)学习----动态代理,布布扣,bubuko.com

设计模式(二)学习----动态代理

标签:style   blog   color   java   使用   os   io   strong   

原文地址:http://www.cnblogs.com/200911/p/3925939.html

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