设计模式之代理模式
代理模式
典型应用场景 房东 中介 租房者,中介就作为房东的代理与租房者沟通,提供附加消息
- 静态代理模式,每个房东都必须创建一个代理类,实现简单但是代码冗余重复很多
- 租房接口实现
package com.gof23.proxy1.demo1;
public interface Rent {
void zf();
}
- 房东实现租房接口
package com.gof23.proxy1.demo1;
public class Host implements Rent {
public void zf(){
System.out.println("我要租房");
}
}
- 代理实现租房接口同时组合租房接口
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();
}
}
- 租客租房测试
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动态代理模式,实现动态代理,对所有的代理对象只要一个代理类
- 动态代理类
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);
}
}
- 租客实现租房
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等,动态代理实现可以作为你的工具类

浙公网安备 33010602011771号