- 目的: 为其他对象提供一种代理以控制对这个对象的访问。
- 核心: 代理类实现与真实主题相同的接口,持有对真实主题的引用。在访问真实主题前后可以添加额外的控制逻辑(如延迟加载、访问控制、日志记录、远程代理等)。
- 场景: 远程过程调用、虚拟代理、保护代理和缓存代理等。
首先有一个接口,声明了若干方法
packageproxy;publicinterfaceIGamePlayer{publicvoidlogin();publicvoidkillBoss();publicvoidupgrade();}然后是被代理的类实现接口
packageproxy;publicclassGamePlayerimplementsIGamePlayer{privateStringname;publicGamePlayer(Stringname){this.name=name;}@Overridepublicvoidlogin(){System.out.println(this.name+" 登录成功!");}@OverridepublicvoidkillBoss(){System.out.println(this.name+" 在打怪!");}@Overridepublicvoidupgrade(){System.out.println(this.name+" 升级了!");}}最后的代理类,也实现接口,并持有接口的引用
packageproxy;publicclassGamePlayerProxyimplementsIGamePlayer{privateIGamePlayergamePlayer;// 持有真实主题的引用publicGamePlayerProxy(IGamePlayergamePlayer){this.gamePlayer=gamePlayer;// 通过构造函数传入真实对象}@Overridepublicvoidlogin(){// 可以在调用前后添加额外逻辑System.out.println("代理:正在验证身份...");this.gamePlayer.login();}@OverridepublicvoidkillBoss(){System.out.println("代理:记录打怪行为...");this.gamePlayer.killBoss();// 玩家击杀boss}@Overridepublicvoidupgrade(){this.gamePlayer.upgrade();// 玩家升级System.out.println("代理:升级完成,记录日志。");}}函数入口
packageproxy;publicclassMainTest{publicstaticvoidmain(String[]args){// 通过构造函数传入真实对象IGamePlayerproxy=newGamePlayerProxy(newGamePlayer("张三"));proxy.login();proxy.killBoss();proxy.upgrade();}}终端输出:
代理:正在验证身份... 张三 登录成功! 代理:记录打怪行为... 张三 在打怪! 张三 升级了! 代理:升级完成,记录日志。