- 目的 : 为其他对象提供一种代理以控制对这个对象的访问。
- 核心 : 代理类实现与真实主题相同的接口,持有对真实主题的引用。在访问真实主题前后可以添加额外的控制逻辑(如延迟加载、访问控制、日志记录、远程代理等)。
- 场景 : 远程过程调用、虚拟代理、保护代理和缓存代理等。
首先有一个接口,声明了若干方法
java
package proxy;
public interface IGamePlayer {
public void login();
public void killBoss();
public void upgrade();
}
然后是被代理的类实现接口
java
package proxy;
public class GamePlayer implements IGamePlayer {
private String name;
public GamePlayer(String name) {
this.name = name;
}
@Override
public void login() {
System.out.println(this.name + " 登录成功!");
}
@Override
public void killBoss() {
System.out.println(this.name + " 在打怪!");
}
@Override
public void upgrade() {
System.out.println(this.name + " 升级了!");
}
}
最后的代理类,也实现接口,并持有接口的引用
java
package proxy;
public class GamePlayerProxy implements IGamePlayer {
private IGamePlayer gamePlayer; // 持有真实主题的引用
public GamePlayerProxy(IGamePlayer gamePlayer) {
this.gamePlayer = gamePlayer; // 通过构造函数传入真实对象
}
@Override
public void login() {
// 可以在调用前后添加额外逻辑
System.out.println("代理:正在验证身份...");
this.gamePlayer.login();
}
@Override
public void killBoss() {
System.out.println("代理:记录打怪行为...");
this.gamePlayer.killBoss(); // 玩家击杀boss
}
@Override
public void upgrade() {
this.gamePlayer.upgrade(); // 玩家升级
System.out.println("代理:升级完成,记录日志。");
}
}
函数入口
java
package proxy;
public class MainTest {
public static void main(String[] args) {
// 通过构造函数传入真实对象
IGamePlayer proxy = new GamePlayerProxy(new GamePlayer("张三"));
proxy.login();
proxy.killBoss();
proxy.upgrade();
}
}
终端输出:
代理:正在验证身份...
张三 登录成功!
代理:记录打怪行为...
张三 在打怪!
张三 升级了!
代理:升级完成,记录日志。
