静态代理其实就是一个代理类,然后有被代理的类。静态代理能被代理的类已经知道好了,就好比一个房子中介,已经知道哪些人房子在这被代理。客户然后去租房子,然后找代理商。代理商和被代理的客户直接联系。客户需要租房子只是和代理商打交道,但是实际客户是租被代理的人的房子;
抽象代理角色:(知道能代理哪些功能,这里的功能和具体被代理角色的功能只能说有调用功能:最后完成操作的还是具体被代理角色)
public abstract class Subject { public abstract void request(); }
具体被代理角色:(正真和谁完成交易)
public class RealSubject extends Subject { public void request() { System.out.println("这个房子是我的!!"); } }
代理角色:(代理被代理角色,能够在功能上就是被代理的人的功能,但实际不是他,他只是拥有权限而已)
public class ProxySubject extends Subject { private RealSubject realSubject;//代理角色内部引用真实角色 public void request() { this.preRequest();//在角色操作之前所附加的操作 if(realSubject == null) { realSubject = new RealSubject(); } this.realSubject.request();//真实角色所完成的事情 this.postRequest();//在角色操作后所附加的操作 } private void preRequest() { System.out.println("pre requset"); } private void postRequest() { System.out.println("post request"); } }
客户端测试:(更具抽象代理角色知道能代理哪些功能(接口中有的,因为具体代理角色中实现 了抽象角色))
public class Client { public static void main(String[] args) { Subject subject = new ProxySubject(); //父类型的引用指向子类型的对象,所以下面调用request方法的时候在父类Subject中必须有这个方法,但是最终还是调用ProxySubject里面的方法 //在这个代理类(ProxySubject)中就有被代理类(realSubject)的引用,并且代理类和被代理类 //共同继承一个接口(subject),所以下面的这个方法在代理类中有这个方法,但是这个方法实现的就是对被 //代理类的调用 subject.request(); //因为真正实现这个方法的类是在那个真实类中的方法,这个类里面的request()方法没有具体操作,就是一个调用 // 这个和策略模式区别。策略模式其实就是多态的用途,传什么进去那么最终调用的就是什么对象的方法。传宝马,最后就是宝马的方法, // 传奥迪就调用奥迪的方法。而且策略这模式的environment这个角色不需要去实现公众接口。在这个类中有一个构造方法,当我构建 // 的时候穿宝马,然后最后调用就是宝马。 // 而代理首先用户不知道最后谁处理,这个代理类去new出来那个真实的类。只有代理类知道具体谁去执行。而策略模式则是用户传什么进去,就调用的是什么的方法 } }