(1)代理模式,以最简单的房屋租赁为例。
抽象角色:一般会使用抽象类或接口(Rent接口);
真实角色:被代理的角色(Host实体类:房东);
代理角色:代理真实的角色(中介,代理房东);
客户端:访问代理角色(买房的顾客);
【1】静态代理:
//客户端
public class Customer {
public static void main(String[] args) {
Host host = new Host();
//实例化代理角色
Proxy proxy = new Proxy();
//代理角色代理房东租房
proxy.setHost(host);
proxy.rent();
}
}
//抽象角色
public interface Rent {
void rent();
}
//真实角色,房东
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东要租房");
}
}
//代理角色,中介
public class Proxy implements Rent {
private Host host;
public Proxy() {
}
public void setHost(Host host) {
this.host = host;
}
@Override
public void rent() {
host.rent();
seeHouse();
hetong();
}
public void seeHouse(){
System.out.println("中介带客户看房");
}
public void hetong(){
System.out.println("中介与客户签合同");
}
}
静态代理的缺点是:一个真实角色就需要一个代理角色去代理,代码量会翻倍。需要找到万金油代理角色,它可以代理一切。
【动态代理】
//客户端
public class Client {
public static void main(String[] args) {
//真实角色
Host host = new Host();
//代理角色:现在没有
ProxyInvovationHandler proxyInvovationHandler = new ProxyInvovationHandler();
//设置要代理的对象
proxyInvovationHandler.setRent(host);
//动态生成代理类
Rent proxy = (Rent) proxyInvovationHandler.getProxy();
proxy.rent();
}
}
//我们会用这个类,自动生成代理类
public class ProxyInvovationHandler implements InvocationHandler {
//被代理的接口
private Rent rent;
public ProxyInvovationHandler() {
}
public void setRent(Rent rent) {
this.rent = rent;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
}
@Override
//处理代理实例,并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质就是使用反射机制实现
seeHouse();
Object result = method.invoke(rent, args);
fare();
return result;
}
public void seeHouse(){
System.out.println("中介带领客户看房子");
}
public void fare(){
System.out.println("中介收中介费");
}
}