Java二十三种设计模式 之代理(proxy),2021大厂Java社招最全面试题

public calss Tank implements Movable{

public void move(){

//记录开始的时间

long start = System.currentTimeMillis();

System.out.println(“Tank moving claclacla…”);

try{

//随机睡眠10秒钟,模拟它开了几秒钟

Thread.sleep(new Random().nextInt(10000));

}catch(InterruptedException e){

e.printStackTrace();

}

//记录结束的时间

long end = System.currentTimeMillis();

//输出结束减开始的时间

System.out.println(end - start);

}

//写方法测试一下

public static void main(String[] args){

Tank t = new Tank();

t.move();

}

}

interface Movable{

void move();

}

第二种方法:

//用代理

public calss Tank implements Movable{

public void move(){

System.out.println(“Tank moving claclacla…”);

try{

//随机睡眠10秒钟,模拟它开了几秒钟

Thread.sleep(new Random().nextInt(10000));

}catch(InterruptedException e){

e.printStackTrace();

}

}

//写方法测试一下

public static void main(String[] args){new TankTimeProxy(new tank().move();}

}

//时间代理

class TankTimeProxy implements Movable{

Tank tank;

public void move(){

//输出开始的时间

long start = System.currentTimeMillis();

tank.move();

//输出结束的时间

long end = System.currentTimeMillis();

//输出结束减开始的时间

System.out.println(end - start);

}

}

//日志代理

class TanklogProxy implements Movable{

Tank tank;

public void move(){

//开始

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

System.out.println(“start moving…”);

tank.move();

//结束

System.out.println(“stopped”);

}

}

interface Movable{

void move();

}

最终的静态代理:

  • 他们共同实现了Movabel这个接口,代理的类型也是Movable,所以他们之间可以相互嵌套。

public calss Tank implements Movable{

public void move(){

System.out.println(“Tank moving claclacla…”);

try{

//随机睡眠10秒钟,模拟它开了几秒钟

Thread.sleep(new Random().nextInt(10000));

}catch(InterruptedException e){

e.printStackTrace();

}

}

//写方法测试一下

public static void main(String[] args){new TankTimeProxy(new TankLogProxy(new tank())).move();}

}

//时间代理

class TankTimeProxy implements Movable{

Movable m;

public TankLogProxy(Movable m ){this.m = m;}

public void move(){

//输出开始的时间

long start = System.currentTimeMillis();

m.move();

//输出结束的时间

long end = System.currentTimeMillis();

//输出结束减开始的时间

System.out.println(end - start);

}

}

//日志代理

class TanklogProxy implements Movable{

Movable m;

public TankLogProxy(Movable m ){this.m = m;}

public void move(){

//开始

System.out.println(“start moving…”);

m.move();

//结束

System.out.println(“stopped”);

}

}

interface Movable{

void move();

}

  • 我们看一下类图

代理对象和被代理对象都实现了Movable接口,将需要的操作添加到代理对象中的move()方法,接下里调用被代理对象的move()方法,这样就可以嵌套了,因为TimeProxy和LogProxy都实现了Movable接口,所以都可以添加到m:Movable这个被代理对象里

在这里插入图片描述

静态代理我们说完了,下面来说说动态代理

  • 动态代理之所以称为动态,是因为代理类在运行时由Proxy类产生,这就大大减少了需要我们手工设计代理类的数量,在实际应用中,Proxy通过类装载器和需要实现的接口来产生代理类,即Proxy.getProxyClass(ClassLoader, Class[]),返回为代理类的Class实例。

public calss Tank implements Movable{

//模拟坦克移动了一段时间

public void move(){

System.out.println(“Tank moving claclacla…”);

try{

//随机睡眠10秒钟,模拟它开了几秒钟

Thread.sleep(new Random().nextInt(10000));

}catch(InterruptedException e){

e.printStackTrace();

}

}

public static void main(String[] args){

Tank tank = new Tank();

Movable m = (Movable)Proxy.newProxyInstonce(Tank.calss.getCalssLoader(),new Class[]{Movable.class},//tank.calss.getInterfaces()

newLogHander(tank);

);

m.move();

}

}

class LogHander implements InvocationHandler{

Tank tank;

public LogHander(Tank tank){

this.tank = tank;

}

public Object invoke(Object proxy,Method methos,Object[] args){

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值