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)高擴大性