静态代理其实就是一个代理类,然后有被代理的类。静态代理能被代理的类已经知道好了,就好比一个房子中介,已经知道哪些人房子在这被代理。客户然后去租房子,然后找代理商。代理商和被代理的客户直接联系。客户需要租房子只是和代理商打交道,但是实际客户是租被代理的人的房子;
抽象代理角色:(知道能代理哪些功能,这里的功能和具体被代理角色的功能只能说有调用功能:最后完成操作的还是具体被代理角色)
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出来那个真实的类。只有代理类知道具体谁去执行。而策略模式则是用户传什么进去,就调用的是什么的方法
}
}