《设计模式之禅》--代理扩展:强制代理
需求:就算你找到真实角色,也强制你使用指定代理
public interface IGamePlayer { //登录游戏 public void login(String user, String password); //杀怪,这是网络游戏的主要特色 public void killBoss(); //升级 public void upgrade(); //每个人都可以找一下自己的代理 public IGamePlayer getProxy(); }
public class GamePlayer implements IGamePlayer { private String name = ""; //我的代理是谁 private IGamePlayer proxy = null; public GamePlayer(String _name) { this.name = _name; } //找到自己的代理 public IGamePlayer getProxy() { this.proxy = new GamePlayerProxy(this); return this.proxy; } //打怪,最期望的就是杀老怪 public void killBoss() { if (this.isProxy()) { System.out.println(this.name + "在打怪!"); } else { System.out.println("请使用指定的代理访问"); } } //进游戏之前你肯定要登录吧,这是一个必要条件 public void login(String user, String password) { if (this.isProxy()) { System.out.println("登录名为" + user + "的用户" + this.name + "登录成功!"); } else { System.out.println("请使用指定的代理访问"); ; } } //升级,升级有很多方法,花钱买是一种,做任务也是一种 public void upgrade() { if (this.isProxy()) { System.out.println(this.name + " 又升了一级!"); } else { System.out.println("请使用指定的代理访问"); } } //校验是否是代理访问 private boolean isProxy() { if (this.proxy == null) { return false; } else { return true; } } }
public class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; //构造函数传递用户名 public GamePlayerProxy(IGamePlayer _gamePlayer) { this.gamePlayer = _gamePlayer; } //代练杀怪 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 IGamePlayer getProxy() { return this; } }
第一次尝试
public class Client { public static void main(String[] args) { //定义一个游戏的角色 IGamePlayer player = new GamePlayer("张三"); //开始打游戏,记下时间戳 System.out.println("开始时间是:2009-8-25 10:45"); player.login("zhangSan", "password"); //开始杀怪 player.killBoss(); //升级 player.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2009-8-26 03:40"); } }
结果
开始时间是:2009-8-25 10:45
请使用指定的代理访问
请使用指定的代理访问
请使用指定的代理访问
结束时间是
第二次尝试
public class Client { public static void main(String[] args) { //定义一个游戏的角色 IGamePlayer player = new GamePlayer("张三"); //然后再定义一个代练者 IGamePlayer proxy = new GamePlayerProxy(player); //开始打游戏,记下时间戳 System.out.println("开始时间是:2009-8-25 10:45"); proxy.login("zhangSan", "password"); //开始杀怪 proxy.killBoss(); //升级 proxy.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2009-8-26 03:40"); } }
结果
开始时间是:2009-8-25 10:45
请使用指定的代理访问
请使用指定的代理访问
请使用指定的代理访问
结束时间是:2009-8-26 03:40
第三次尝试
public class Client { public static void main(String[] args) { //定义一个游戏的角色 IGamePlayer player = new GamePlayer("张三"); //获得指定的代理 IGamePlayer proxy = player.getProxy(); //开始打游戏,记下时间戳 System.out.println("开始时间是:2009-8-25 10:45"); proxy.login("zhangSan", "password"); //开始杀怪 proxy.killBoss(); //升级 proxy.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2009-8-26 03:40"); } }
结果
开始时间是:2009-8-25 10:45
登录名为zhangSan 的用户张三登录成功!
张三在打怪!
张三 又升了一级!
结束时间是:2009-8-26 03:40
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现