0
点赞
收藏
分享

微信扫一扫

网络攻击离你有多近?

在Java中,静态代理是一种设计模式,它涉及到为一个对象提供一个代理以控制对这个对象的访问。静态代理在编译时就已经确定,代理类和被代理类会实现相同的接口或者是代理类继承被代理类。客户端通过代理类来访问(调用)被代理类的方法,而代理类可以在调用前后添加一些额外的处理逻辑。

目录

一、目录结构

二、各个部分

三、测试


一、目录结构

二、各个部分

(1)首先定义Rent接口和Host类,并且Host类实现了Rent接口。

public interface Rent {
  public void rent();
}
public class Host implements Rent{
  @Override
  public void rent() {
    System.out.println("房东租房");
  }
}

(2)新建一个Proxy类,Proxy 类包含了对 Host 类的引用,并且实现了租房的相关操作,如 rent() 方法。在 rent() 方法中,除了调用 host.rent() 来完成实际的租房操作外,还添加了额外的行为:see()fare() 方法,分别表示中介带客户看房和收取中介费。

public class Proxy {
  private Host host;

  public Proxy(){
  }

  public Proxy(Host host){
    this.host = host;
  }

  public void rent(){
    see();
    host.rent();
    fare();
  }

  public void see(){
    System.out.println("中介带你看房子");
  }

  public void fare(){
    System.out.println("收中介费");
  }
}

(3)创建一个Client 类,Client 类是客户端类,表示租房的客户,它使用 Proxy 类(代理类)来访问 Host

public class Client {
  public static void main(String[] args) {
    Host host = new Host();
    Proxy proxy = new Proxy(host);  // 代理
    proxy.rent();
  }
}

三、测试

运行代码的结果:

在这个例子中,House 类表示待租的房源,Proxy 类是中介服务,Client 类是租房的客户。当客户通过中介租房时,中介会先带客户看房,然后完成租房交易,最后收取中介费。

四、总结

(1)静态代理的好处:

  1. 增强被代理类的功能:代理类可以在不修改被代理类代码的情况下,对被代理类的方法进行增强,例如添加日志记录、事务处理、安全检查等。

  2. 实现客户端与被代理类的解耦:客户端只与代理类交互,降低了客户端与被代理类之间的直接依赖,有利于系统的扩展和维护。

  3. 控制访问:代理类可以控制对被代理类方法的访问,例如限制访问频率、实现权限校验等。

(2)静态代理的缺点:

  1. 代码冗余:如果有很多类需要被代理,那么就需要为每一个类都编写一个对应的代理类,这会导致系统中类的数量增加,代码冗余度高。

  2. 不易维护:当被代理类增加、删除或修改方法时,需要同步更新代理类,增加了维护的复杂性。

  3. 灵活性差:静态代理的模式比较固定,不够灵活,不易于应对频繁变化的业务需求。

  4. 无法代理没有接口的类:在Java中,如果一个类没有实现任何接口,并且被声明为final,那么它就不能被代理(这里指的是静态代理和基于接口的JDK动态代理,但可以通过CGLIB等库实现对类的动态代理)。

(3)为了克服静态代理的缺点,Java提供了动态代理机制,它可以在运行时动态地创建一个代理类,而不需要为每个被代理类手动编写代理代码。动态代理主要依赖于Java的反射机制来实现。

举报

相关推荐

0 条评论