代理模式简单来说就是:我们使用代理对象来代替对真实对象的访问,在不修改原目标对象代码的情况下,提供额外的功能操作,扩展目标对象的功能。
代理模式的主要功能就是:扩展目标对象的功能,增强目标对象的某个方法,比如在某个方法执行前增加日志操作等等。
静态代理中,我们对目标对象的每个方法的增强都是手动完成的(后面会具体演示代码),非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)且麻烦(需要对每个目标类都单独写一个代理类)。实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。
静态代理创建步骤:
1.定义一个接口及其实现类
2.创建一个代理类同样实现这个接口
3.将目标对象注注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情。
创建一个租房的接口
public interface Rent {
public void rent();
}
再创建一个房东的类,并且实现这个接口
//房东
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东出租了房子");
}
}
创建一个中介的类,并且也实现这个接口
public class proxy {
private Rent rent;
public proxy(Rent rent) {
this.rent = rent;
}
private void getRent(Rent rent){
this.rent=rent;
}
public void rent() {
System.out.println("带你看房子");
rent.rent();
System.out.println("签合同");
System.out.println("拿佣金");
}
}
一个人想要租房,但是他不直接找房东,去找房东的代理人房屋中介,并且中介在原来的租房这一事物上,加了一些其他的东西,比如带你看房,收取佣金,
public class client {
public static void main(String[] args) {
Host host = new Host();
proxy proxy = new proxy(host);
proxy.rent();
}
}
静态代理
优缺:在不修改目标对象的前提下,可以通过代理对象对目标对象功能扩展
缺点:理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。