(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 {@Overridepublic void rent() {System.out.println("房东要租房");}}
//代理角色,中介public class Proxy implements Rent {private Host host;public Proxy() {}public void setHost(Host host) {this.host = host;}@Overridepublic 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("中介收中介费");}}
