設計模式(二)學習----動態代理

來源:互聯網
上載者:User

標籤:style   blog   color   java   使用   os   io   strong   

動態代理:動態代理是指在實現階段不需要關心代理誰,而在運行階段才指定代理哪一個對象。Spring AOP採用的核心思想就是動態代理設計模式。

 下面看動態代理的UML類圖:

   

下面思考問題: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();    }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.