您的位置:首页 > 编程语言 > Java开发

Java设计模式之代理模式

2017-08-13 00:46 337 查看

模式介绍

代理模式为其他对象提供一种代理以控制对这个对象的访问。

应用场景

生活中有很多代理模式的例子,例如你有房要出售,就会找中介帮忙把你的房子出售,这个过程中介就是代理。

代码例子

下面使用一个中介帮人出售房屋的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();
}
}


打印

发布房屋出售消息
联系客户
带客户看房
签约
卖房
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式