java代理模式
2021/9/17 22:06:41
本文主要是介绍java代理模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
- 一、代理模式
- 组成:
- 二、静态代理
- 1.类结构图
- 2.代码示例
- Person接口
- Student(被代理)类
- SquadLeader(代理)类
- 3.测试
- 测试类
- 运行结果
- 三、动态代理
- 1.类结构图
- 2.代码示例
- Star接口
- ChinaStar(被代理)类
- DynamicProxy(动态代理)类
- 3.测试
- 测试类
- 运行结果
一、代理模式
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
组成:
- 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
- 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
- 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
二、静态代理
1.类结构图
2.代码示例
Person接口
public interface Person { void giveMoney();// 交费 }
Student(被代理)类
public class Student implements Person { private String name; public Student(String name) { this.name = name; } @Override public void giveMoney() { System.out.println(name + "上交班费100元"); } }
SquadLeader(代理)类
public class SquadLeader implements Person { private Student stu; public SquadLeader(Person stu) { if (stu instanceof Student) { this.stu = (Student) stu; } } @Override public void giveMoney() { System.out.println("班长收班费"); stu.giveMoney(); System.out.println("班长上交班费"); } }
3.测试
测试类
public class StaticProxyTest { public static void main(String[] args) { Student zs = new Student("张三");// 创建学生(被代理)类 SquadLeader squadLeader = new SquadLeader(zs);// 创建班长(代理)类 squadLeader.giveMoney();// 班长代上交班费 } }
运行结果
班长收班费 张三上交班费100元 班长上交班费
三、动态代理
1.类结构图
2.代码示例
Star接口
public interface Star { void sing(String name); void dance(String name); }
ChinaStar(被代理)类
public class ChinaStar implements Star { private String name; public ChinaStar(String name) { this.name = name; } @Override public void sing(String name) { System.out.println(this.name + "唱了一首:" + name); } @Override public void dance(String name) { System.out.println(this.name + "跳了一段:" + name); } }
DynamicProxy(动态代理)类
public class DynamicProxy<T> implements InvocationHandler { private T target; // 设置被代理的对象 public void setTarget(T target) { this.target = target; } // 创建代理对象 public T creatProxy() throws Exception { Objects.requireNonNull(target,"请先设置被代理对象"); return (T) Proxy.newProxyInstance(target.getClass(). getClassLoader(),target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object invoke = method.invoke(target, args); after(); return invoke; } private void before() { System.out.println("准备工作"); } private void after() { System.out.println("收尾工作"); } }
3.测试
测试类
public class DynamicProxyTest { public static void main(String[] args) throws Throwable { // 三个被代理对象 ChinaStar liRongHao = new ChinaStar("李荣浩"); ChinaStar zhouJieLun = new ChinaStar("蔡徐坤"); Student zhangSan = new Student("张三"); // 一个动态代理类 DynamicProxy dynamicProxy = new DynamicProxy(); // 明星代理类 dynamicProxy.setTarget(liRongHao); Star star = (Star) dynamicProxy.creatProxy(); star.sing("年少有为"); System.out.println("******************************"); dynamicProxy.setTarget(zhouJieLun); star = (Star) dynamicProxy.creatProxy(); star.dance("鸡你太美"); System.out.println("******************************"); // 学生代理类 dynamicProxy.setTarget(zhangSan); Person person = (Person) dynamicProxy.creatProxy(); person.giveMoney(); } }
运行结果
准备工作 李荣浩唱了一首:年少有为 收尾工作 ****************************** 准备工作 蔡徐坤跳了一段:鸡你太美 收尾工作 ****************************** 准备工作 张三上交班费100元 收尾工作
这篇关于java代理模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南