(1)代理模式,以最简单的房屋租赁为例。
    image.png
    抽象角色:一般会使用抽象类或接口(Rent接口);
    真实角色:被代理的角色(Host实体类:房东);
    代理角色:代理真实的角色(中介,代理房东);
    客户端:访问代理角色(买房的顾客);
    【1】静态代理:

    1. //客户端
    2. public class Customer {
    3. public static void main(String[] args) {
    4. Host host = new Host();
    5. //实例化代理角色
    6. Proxy proxy = new Proxy();
    7. //代理角色代理房东租房
    8. proxy.setHost(host);
    9. proxy.rent();
    10. }
    11. }
    1. //抽象角色
    2. public interface Rent {
    3. void rent();
    4. }
    1. //真实角色,房东
    2. public class Host implements Rent {
    3. @Override
    4. public void rent() {
    5. System.out.println("房东要租房");
    6. }
    7. }
    1. //代理角色,中介
    2. public class Proxy implements Rent {
    3. private Host host;
    4. public Proxy() {
    5. }
    6. public void setHost(Host host) {
    7. this.host = host;
    8. }
    9. @Override
    10. public void rent() {
    11. host.rent();
    12. seeHouse();
    13. hetong();
    14. }
    15. public void seeHouse(){
    16. System.out.println("中介带客户看房");
    17. }
    18. public void hetong(){
    19. System.out.println("中介与客户签合同");
    20. }
    21. }

    静态代理的缺点是:一个真实角色就需要一个代理角色去代理,代码量会翻倍。需要找到万金油代理角色,它可以代理一切。
    【动态代理】

    1. //客户端
    2. public class Client {
    3. public static void main(String[] args) {
    4. //真实角色
    5. Host host = new Host();
    6. //代理角色:现在没有
    7. ProxyInvovationHandler proxyInvovationHandler = new ProxyInvovationHandler();
    8. //设置要代理的对象
    9. proxyInvovationHandler.setRent(host);
    10. //动态生成代理类
    11. Rent proxy = (Rent) proxyInvovationHandler.getProxy();
    12. proxy.rent();
    13. }
    14. }
    1. //我们会用这个类,自动生成代理类
    2. public class ProxyInvovationHandler implements InvocationHandler {
    3. //被代理的接口
    4. private Rent rent;
    5. public ProxyInvovationHandler() {
    6. }
    7. public void setRent(Rent rent) {
    8. this.rent = rent;
    9. }
    10. //生成得到代理类
    11. public Object getProxy(){
    12. return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
    13. }
    14. @Override
    15. //处理代理实例,并返回结果
    16. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    17. //动态代理的本质就是使用反射机制实现
    18. seeHouse();
    19. Object result = method.invoke(rent, args);
    20. fare();
    21. return result;
    22. }
    23. public void seeHouse(){
    24. System.out.println("中介带领客户看房子");
    25. }
    26. public void fare(){
    27. System.out.println("中介收中介费");
    28. }
    29. }