静态代理模式

本文详细介绍了Java中的静态代理概念及其实现方式,包括继承和聚合两种方法,并通过具体实例展示了如何为方法添加额外的日志记录和执行时间计算等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java中,静态代理指的是代理类的产生发生在源程序编译阶段,在编译之后生成目标程序中包括代理类的class文件。程序运行时,直接装载代理类,生成代理对象。

静态代理有两种实现方式:继承方式和聚合方式

实例:

有一辆坦克,他可以移动,我们想要在记录它移动一次的时间,即执行move()这个方法所用的时间,同时,又想要在它移动或者记录时间之前或之后记录一些日志。

实现方式:

定义移动的接口类 Moveable.java

package com.fgh.proxy; public interface Moveable { void move(); }

第一个实现类Tank.java

package com.fgh.proxy; import java.util.Random; public class Tank implements Moveable { public void move() { System.out.println("Tank moving......."); try { Thread.sleep(new Random().nextInt(2000)); } catch (InterruptedException e) { e.printStackTrace(); } } }

一、继承方式

TankExten.java

package com.fgh.proxy; /** * 继承方式实现代理 * @author fgh * */ public class TankExten extends Tank { /** * 重写父类的方法 */ @Override public void move() { System.out.println("Tank Starting...."); super.move(); System.out.println("Tank Stoping......."); } }

二、聚合方式

TankLogProxy.java 添加打印日志的逻辑

package com.fgh.proxy; /** * 聚合方式实现代理 添加打印日志的逻辑 * @author fgh * */ public class TankLogPrxoxy implements Moveable { Moveable m; public TankLogPrxoxy(Moveable m) { super(); this.m = m; } public void move() { System.out.println("Tank Start..."); m.move(); System.out.println("Tank Stop..."); } } TankTimeProxy.java

计算move()方法的执行时间package com.fgh.proxy; /** * 聚合方式 计算move()方法执行时间 * @author fgh * */ public class TankTimeProxy implements Moveable { Moveable m; public TankTimeProxy(Moveable m) { super(); this.m = m; } public void move() { long start = System.currentTimeMillis(); System.out.println("StartTime:" + start); m.move(); long end = System.currentTimeMillis(); System.out.println("Execute Time= " + (end - start)+"ms"); } }

测试代码:Client.java

package com.fgh.proxy; /** * 静态代理 * @author fgh * */ public class Client { public static void main(String[] args) { Tank t = new Tank(); //move()方法外面套一层打印日志逻辑 TankLogPrxoxy tlp = new TankLogPrxoxy(t); //接着在外面套一层计算move()方法执行时间的逻辑 TankTimeProxy ttp = new TankTimeProxy(tlp); ttp.move(); // TankExten te = new TankExten(); // te.move(); } }
总结:继承方式容易造成类的堆叠 假如有100个类 那我们要继承100次

聚合方式比较灵活,推荐使用



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值