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

简单理解java动态代理---卖票例子

2014-08-11 10:35 351 查看
经常碰到有关java动态代理的问题或是面试,昨天乘着是周末就查了些资料,然后自己写了点代码梳理了一番;

说到动态代理就一定得说下这些个必定会用到的词语:(这里以火车站,机场,临时售票点为例)

代理类-----即是临时售票点,

特点:

1.它即卖火车票,也卖飞机票,我们要买票的时候也必须告诉对方我们要买什么票(被代理类);

2.它没有卖票的权利,临时售票点卖票实际还是火车站/机场在卖;

3.在卖票之前要收取手续费;

被代理类---即火车站/机场

特点:实际卖票的大东家,规定了卖票的价格,车次等;

示例代码

1.一个接口,定义卖票方法

public interface SellTickets {
public void Sell();//卖票
}
2.定义火车站类,飞机类并实现卖票的操作

public class Airport implements SellTickets{

public void Sell() {
System.out.println("机场:我是卖飞机票的  要买机票必须经过我这里 ");
}
}

public class TrainStation implements SellTickets {
public void Sell() {
System.out.println("火车站:我是卖火车票的  要买火车票必须经过我这里 ");
}
}


3.临时售票点

public class SellTicketsHandel implements InvocationHandler{
private  Object obj;//被代理对象   	//要买什么票:火车票,机票
public SellTicketsHandel(Object obj){//这个构造方法一定要,没有的话会抛异常
this.obj = obj;
}

public Object invoke(Object obj, Method method, Object[] arg)
throws Throwable {
Object result = null;//返回值

sf();//先收费----不管什么票,只要是卖票就先收费

result  =  method.invoke(this.obj,arg);	//这个地方的obj,不是参数中的obj,而是成员变量this.obj

end();//结束

return result;
}
private void sf(){
System.out.println("临时售票点:代理火车站/机场提供服务,请先交服务费--------");
}
private void end(){
System.out.println("临时售票点:买票成功!");
}

}
4.去售票点买票

public class TestSell {
public static void main(String args[]){

SellTickets trasin = new TrainStation();//火车站票
SellTickets air = new Airport();	//机票

//临时售票点--------------小区附近的临时售票点
InvocationHandler handel = new SellTicketsHandel(trasin);//告诉售票点 要买的是火车票

InvocationHandler hande2 = new SellTicketsHandel(air);//告诉售票点  要买的是飞机票

SellTickets proxy  =  (SellTickets) Proxy.newProxyInstance(trasin.getClass().getClassLoader(), trasin.getClass().getInterfaces(), handel);
SellTickets proxy2  =  (SellTickets) Proxy.newProxyInstance(air.getClass().getClassLoader(), air.getClass().getInterfaces(), hande2);

proxy.Sell();
proxy2.Sell();
}
}

控制台输出结果:

临时售票点:代理火车站/机场提供服务,请先交服务费--------

火车站:我是卖火车票的  要买火车票必须经过我这里 

临时售票点:买票成功!

临时售票点:代理火车站/机场提供服务,请先交服务费--------

机场:我是卖飞机票的  要买机票必须经过我这里 

临时售票点:买票成功!

可以这样理解,火车站/机场(被代理类)通过这种方式就可以不用更改自身的卖票流程,只需通过售票点(代理类)就可以在卖票这一项服务中达到收取额外手续费的目的;

在我们的开发中就可以用在进行CRUD操作时,加上事务操作.将事务操作独立出来;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态代理