设计模式之代理模式

代理模式

典型应用场景 房东 中介 租房者,中介就作为房东的代理与租房者沟通,提供附加消息

  • 静态代理模式,每个房东都必须创建一个代理类,实现简单但是代码冗余重复很多
  1. 租房接口实现
package com.gof23.proxy1.demo1;

public interface Rent {
    void zf();
}
  1. 房东实现租房接口
package com.gof23.proxy1.demo1;

public class Host implements Rent {
    public void zf(){
        System.out.println("我要租房");
    }
}
  1. 代理实现租房接口同时组合租房接口
package com.gof23.proxy1.demo1;

public class Proxy implements Rent{
    private Rent rent;
    public void setRent(Rent rent){
        this.rent = rent;
    }
    @Override
    public void zf() {
        rent.zf();
    }
}
  1. 租客租房测试
package com.gof23.proxy1.demo1;

public class Client {
    public static void main(String[] args) {
        Host host = new Host();
        Proxy proxy = new Proxy();
        proxy.setRent(host);
        proxy.zf();
    }
}
  • jdk动态代理模式,实现动态代理,对所有的代理对象只要一个代理类
  1. 动态代理类
package com.gof23.proxy1.demo2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyVocationHandler implements InvocationHandler {
    private Object target;
    public void setTarget(Object obj){
        this.target = obj;
    }

    public Object getProxy(){
       return Proxy.newProxyInstance(this.getClass().getClassLoader(),
               target.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target,args);
    }
}
  1. 租客实现租房
package com.gof23.proxy1.demo2;

public class Client {
    public static void main(String[] args) {
        Host host = new Host();
        ProxyVocationHandler proxyVocationHandler = new ProxyVocationHandler();
        proxyVocationHandler.setTarget(host);
        Rent rent = (Rent)proxyVocationHandler.getProxy();
        rent.zf();
    }
}

小结: 动态代理相当重要,大部分框架底层都会用到动态代理,有spring、mybatis等,动态代理实现可以作为你的工具类

posted @ 2021-09-28 21:17  回望初心  阅读(42)  评论(0)    收藏  举报