十二、代理模式

  • 目的 : 为其他对象提供一种代理以控制对这个对象的访问
  • 核心 : 代理类实现与真实主题相同的接口,持有对真实主题的引用。在访问真实主题前后可以添加额外的控制逻辑(如延迟加载、访问控制、日志记录、远程代理等)。
  • 场景 : 远程过程调用、虚拟代理、保护代理和缓存代理等。

首先有一个接口,声明了若干方法

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();
	}
}

终端输出:

复制代码
代理:正在验证身份...
张三 登录成功!
代理:记录打怪行为...
张三 在打怪!
张三 升级了!
代理:升级完成,记录日志。
相关推荐
Rain的Java大神之路几秒前
PC版网站被狂刷怎么处理
java·数据库·redis·后端·mysql·web安全·运维开发
宸津-代码粉碎机17 分钟前
AI工程化高阶实战|从Demo到生产落地核心架构、全套源码与避坑指南
java·大数据·开发语言·人工智能·python·架构
泡海椒1 小时前
告别手写 HTTP 模板!JQuick-Curl:直接把 curl 命令跑在 Java 中
java·网络协议·http
珍珠先生1 小时前
第2章 集合框架深度:HashMap 原理与并发集合
java
FreeTinker2 小时前
Java文件服务器的技术选型与实现路径:从嵌入式工具到企业级系统
java·服务器·开发语言
ly76892 小时前
Java 21 到 Java 26 新特性详解:虚拟线程、模式匹配、结构化并发、HTTP/3 与 AOT
java·jvm
我星期八休息2 小时前
Linux I/O多路转接—epoll
java·linux·运维·服务器·开发语言·jvm·算法
学长毕业设计3 小时前
基于springboot的云南中草药知识普及管理网站的设计与开发(源码+文档+讲解视频)
java·spring boot·后端
大模型码小白3 小时前
AI 提示词专栏:使用系统指令(System Prompt)实现全局约束
java·大数据·运维·开发语言·人工智能·python·prompt
cxoptics3 小时前
蓝宝石的轴向在窗片和偏振片中起的作用
java