Java應用設計形式中的署理形式構建項目標實例展現。本站提示廣大學習愛好者:(Java應用設計形式中的署理形式構建項目標實例展現)文章只能為提供參考,不一定能成為您想要的結果。以下是Java應用設計形式中的署理形式構建項目標實例展現正文
概念
署理形式(Proxy):署理形式其實就是多一個署理類出來,替原對象停止一些操作。好比咱有的時刻打訟事須要請律師,由於律師在司法方面有特長,可以替咱停止操作表達咱的設法主意,這就是署理的意思。署理形式分為兩類:1、靜態署理(不應用jdk外面的辦法);2、靜態署理(應用jdk外面的InvocationHandler和Proxy)。
靜態署理由法式員創立或對象生成署理類的源碼,再編譯署理類。所謂靜態也就是在法式運轉前就曾經存在署理類的字節碼文件,署理類和拜托類的關系在運轉前就肯定了。
靜態署理類的源碼是在法式運轉時代由JVM依據反射等機制靜態的生成,所以不存在署理類的字節碼文件。署理類和拜托類的關系是在法式運轉時肯定。
示例
這裡我們舉一個靜態署理的例子:
類圖:
/** * 游戲者接口 * */ public interface IGamePlayer { // 登錄游戲 public void login(String user, String password); // 殺怪,收集游戲的重要特點 public void killBoss(); // 進級 public void upgrade(); }
/** * 游戲者 * */ public class GamePlayer implements IGamePlayer { private String name = ""; // 經由過程結構函數傳遞稱號 public GamePlayer(String _name) { this.name = _name; } // 打怪,最希冀的就是殺老怪 public void killBoss() { System.out.println(this.name + " 在打怪!"); } // 進游戲之前你確定要登錄吧,這是一個需要前提 public void login(String user, String password) { System.out.println("登錄名為" + user + " 的腳色 " + this.name + "登錄勝利!"); } // 進級,進級有許多辦法,花錢買是一種,做義務也是一種 public void upgrade() { System.out.println(this.name + " 又升了一級!"); } }
/** * 客戶端 對被署理對象弗成見 */ public class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null;//被署理對象 // 經由過程結構函數傳遞要對誰停止代練 public GamePlayerProxy(String username) { this.gamePlayer = new GamePlayer(username); } // 代練殺怪 public void killBoss() { this.gamePlayer.killBoss(); } // 代練登錄 public void login(String user, String password) { this.gamePlayer.login(user, password); } // 代練進級 public void upgrade() { this.gamePlayer.upgrade(); } }
/* * 客戶端 對被署理對象弗成見 */ public class GamePlayerProxy2 implements IGamePlayer { private IGamePlayer gamePlayer = null;//被署理對象 // 經由過程結構函數傳遞要對誰停止代練 public GamePlayerProxy2(String username) { this.gamePlayer = new GamePlayer(username); } // 代練殺怪 public void killBoss() { this.gamePlayer.killBoss(); } // 代練登錄 public void login(String user, String password) { System.out.println("登錄時光是:" + new Date().toLocaleString()); this.gamePlayer.login(user, password); } // 代練進級 public void upgrade() { this.gamePlayer.upgrade(); System.out.println("進級時光是:" + new Date().toLocaleString()); } }
/* * 客戶端 對被署理對象弗成見 */ public class GamePlayerProxy3 { private IGamePlayer gamePlayer; // 經由過程結構函數傳遞 被代練(署理)對象 public GamePlayerProxy3(IGamePlayer gamePlayer) { this.gamePlayer = gamePlayer; System.out.println("我是一位代練,我玩的腳色是他人的,可以靜態傳遞出去"); } public IGamePlayer getProxy() { return (IGamePlayer) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{IGamePlayer.class}, new MyInvocationHandler()); } private class MyInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("login")) { System.out.println("登錄時光是:" + new Date().toLocaleString()); } if (method.getName().equals("upgrade")) { System.out.println("進級時光是:" + new Date().toLocaleString()); } method.invoke(gamePlayer, args); return null; } } }
public class Test { public static void main(String[] args) { /* * 通俗的靜態署理: 客戶端不曉得被署理對象,由署理對象完成其功效的挪用 */ IGamePlayer proxy = new GamePlayerProxy("X"); System.out.println("開端時光是:" + new Date().toLocaleString()); proxy.login("zhangSan", "abcd"); proxy.killBoss(); proxy.upgrade(); System.out.println("停止時光是:" + new Date().toLocaleString()); System.out.println(); /* * 署理對象 加強了 被署理對象的功效 */ IGamePlayer proxy2 = new GamePlayerProxy2("M"); proxy2.login("lisi", "efg"); proxy2.killBoss(); proxy2.upgrade(); System.out.println(); /* * 靜態署理:應用jdk供給的InvocationHandler,反射挪用被署理對象的辦法 * 聯合java.reflect.Proxy 發生署理對象 * 靜態傳入被署理對象結構InvocationHandler,在handler中的invoke時可以加強被署理對象的辦法的功效 * 或許說:(面向切面:)在甚麼處所(銜接點), 履行甚麼行動(告訴) * GamePlayerProxy3中是辦法名為login時告訴開端時光,upgrade時告訴停止時光 */ GamePlayerProxy3 dynamic = new GamePlayerProxy3(new GamePlayer("Y")); IGamePlayer dynamicPlayer = dynamic.getProxy(); dynamicPlayer.login("wangwu", "1234"); dynamicPlayer.killBoss(); dynamicPlayer.upgrade(); /* * 面向切面: 一些類似的營業邏輯須要加在浩瀚的處所,那們便可以把它提取到切面中, 切面也就是事務切面:如日記切面、權限切面、營業切面 */ } }
打印:
開端時光是:2014-10-8 17:19:05 登錄名為zhangSan 的腳色 X登錄勝利! X 在打怪! X 又升了一級! 停止時光是:2014-10-8 17:19:05 登錄時光是:2014-10-8 17:19:05 登錄名為lisi 的腳色 M登錄勝利! M 在打怪! M 又升了一級! 進級時光是:2014-10-8 17:19:05 我是一位代練,我玩的腳色是他人的,可以靜態傳遞出去 登錄時光是:2014-10-8 17:19:05 登錄名為wangwu 的腳色 Y登錄勝利! Y 在打怪! 進級時光是:2014-10-8 17:19:05 Y 又升了一級!
長處
(1)職責清楚
真實的腳色就是完成現實的營業邏輯,不消關懷其他非本職責的事務,經由過程前期的署理完成一件完成事務,附帶的成果就是編程簡練清楚。
(2)署理對象可以在客戶端和目的對象之間起到中介的感化,如許起到了的感化和掩護了目的對象的感化。
(3)高擴大性