模式介绍
代理模式为其他对象提供一种代理以控制对这个对象的访问。
应用场景
生活中有很多代理模式的例子,例如你有房要出售,就会找中介帮忙把你的房子出售,这个过程中介就是代理。
代码例子
下面使用一个中介帮人出售房屋的demo来模拟代理模式。
uml 图
静态代理
房屋出售接口
/**
* 房屋出售
*/
public interface SellHouse {
/**
* 发布出售内容
*/
public void publish();
/**
* 联系客户
*/
public void contactCustomer();
/**
* 带客户看房
*/
public void seeHouse();
/**
* 签约
*/
public void sign();
/**
* 卖房
*/
public void sell();
}
房东类
/**
* 房东
*/
public class Fangdong implements SellHouse {
@Override
public void publish() {
System.out.println("发布房屋出售消息");
}
@Override
public void contactCustomer() {
System.out.println("联系客户");
}
@Override
public void seeHouse() {
System.out.println("带客户看房");
}
@Override
public void sign() {
System.out.println("签约");
}
@Override
public void sell() {
System.out.println("卖房");
}
}
中介类
/**
* 房屋出售
*/
public interface SellHouse {
/**
* 发布出售内容
*/
public void publish();
/**
* 联系客户
*/
public void contactCustomer();
/**
* 带客户看房
*/
public void seeHouse();
/**
* 签约
*/
public void sign();
/**
* 卖房
*/
public void sell();
}
Main
/**
* 代理模式-静态代理
*/
public class Main {
public static void main(String args[]){
//房东
Fangdong f = new Fangdong();
//中介
Zhongjie zhongjie = new Zhongjie(f);
//房屋消息
zhongjie.publish();
//联系客户
zhongjie.contactCustomer();
//带客户看房
zhongjie.seeHouse();
//签约
zhongjie.sign();
//交房
zhongjie.sell();
}
}
动态代理
通过反射机制动态生成代理者的对象,java给我们提供了一个便捷的动态代理接口InvocationHandler。
DynamicProxy
定义一个DynamicProxy类实现InvocationHandler
/**
* 动态代理类
*/
public class DynamicProxy implements InvocationHandler{
private Object object;
public DynamicProxy(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result;
//调用被代理类对象的方法
result = method.invoke(object,args);
return result;
}
}
Main2
/**
* 代理模式-动态代理
*/
public class Main2 {
public static void main(String args[]){
//房东
Fangdong fangdong = new Fangdong();
//动态代理
DynamicProxy proxy = new DynamicProxy(fangdong);
//动态构建一个代理
SellHouse sellHouse = (SellHouse) Proxy.newProxyInstance(fangdong.getClass().getClassLoader(),fangdong.getClass().getInterfaces(),proxy);
//发布
sellHouse.publish();
//联系客户
sellHouse.contactCustomer();
//带人看房
sellHouse.seeHouse();
//签约
sellHouse.sign();
//卖房
sellHouse.sell();
}
}
打印
发布房屋出售消息
联系客户
带客户看房
签约
卖房