概述
- 主題角色接口,主要用來定義操作;
- 主題角色接口實作類,主要實作接口中定義的操作;
- 主題角色處理器類,該類實作 java.lang.reflect.InvocationHandler 接口,并定義主題角色實作類方法被調用前或調用後的其他處理;
主題角色接口
public interface IGamePlayer {
//登入
void login(String user,String password);
//殺怪
void killBoss();
//更新
void upgrage();
//每個人都可以找一下自己的代理
}
題角色接口實作類
public class GamePlayer implements IGamePlayer {
private String name;
public GamePlayer(String name) {
this.name = name;
}
@Override
public void login(String user, String password) {
System.out.println("登入名為:" + user + "的使用者" + this.name+ "登入成功!");
}
@Override
public void killBoss() {
System.out.println(this.name + "在打怪");
}
@Override
public void upgrage() {
System.out.println(this.name + "又升了一級");
}
}
主題角色處理器類
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class GamePlayIH implements InvocationHandler {
//被代理者
Class cls = null;
//被代理的執行個體
Object obj = null;
//我要代理誰
public GamePlayIH(Object obj) {
this.obj = obj;
}
//調用被代理的方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Thread.sleep(1200);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(new Date()) + " 方法:" + method.getName() + "被調用");
Object result = method.invoke(this.obj,args);
return result;
}
}
用戶端類
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Client {
public static void main(String[] args) {
//定義一個癡迷的玩家
IGamePlayer player = new GamePlayer("張三");
//定義一個handler
InvocationHandler handler = new GamePlayIH(player);
//開始打遊戲,記下時間戳
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("開始時間是:" + df.format(new Date()));
//獲得類的class loader
ClassLoader c1 = player.getClass().getClassLoader();
//動态産生一個代理者
IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(c1,new Class[]{IGamePlayer.class},handler);
//登入
proxy.login("zhangsan","1234");
//開始殺怪
proxy.killBoss();
//更新
proxy.upgrage();
//記錄結束遊戲時間
System.out.println("結束時間是:" + df.format(new Date()));
}
}