简单理解java动态代理---卖票例子
2014-08-11 10:35
351 查看
经常碰到有关java动态代理的问题或是面试,昨天乘着是周末就查了些资料,然后自己写了点代码梳理了一番;
说到动态代理就一定得说下这些个必定会用到的词语:(这里以火车站,机场,临时售票点为例)
代理类-----即是临时售票点,
特点:
1.它即卖火车票,也卖飞机票,我们要买票的时候也必须告诉对方我们要买什么票(被代理类);
2.它没有卖票的权利,临时售票点卖票实际还是火车站/机场在卖;
3.在卖票之前要收取手续费;
被代理类---即火车站/机场
特点:实际卖票的大东家,规定了卖票的价格,车次等;
示例代码
1.一个接口,定义卖票方法
3.临时售票点
控制台输出结果:
临时售票点:代理火车站/机场提供服务,请先交服务费--------
火车站:我是卖火车票的 要买火车票必须经过我这里
临时售票点:买票成功!
临时售票点:代理火车站/机场提供服务,请先交服务费--------
机场:我是卖飞机票的 要买机票必须经过我这里
临时售票点:买票成功!
可以这样理解,火车站/机场(被代理类)通过这种方式就可以不用更改自身的卖票流程,只需通过售票点(代理类)就可以在卖票这一项服务中达到收取额外手续费的目的;
在我们的开发中就可以用在进行CRUD操作时,加上事务操作.将事务操作独立出来;
说到动态代理就一定得说下这些个必定会用到的词语:(这里以火车站,机场,临时售票点为例)
代理类-----即是临时售票点,
特点:
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操作时,加上事务操作.将事务操作独立出来;
相关文章推荐
- Java动态代理简单理解JDK
- Java 动态代理机制简单理解
- JAVA动态代理实现aop的简单例子
- Java设计模式之静态代理和动态代理(简单例子)
- java动态代理--一个简单的例子
- java自身的动态代理简单例子。
- java动态代理--比较容易理解的例子
- java动态代理--一个简单的例子
- Android插件化开发基础之Java动态代理(proxy)机制的简单例子
- java 简单的动态代理例子
- java 动态代理学——自己的理解
- 网摘-java静态代理和动态代理例子(jdk动态代理和cglib动态代理)
- java动态代理的的理解
- java中利用动态代理,生成"空"对象的例子
- java动态代理设计模式简单示例
- Java动态代理简单实现
- java动态代理简单实例
- Java的动态代理的理解 .
- 深入理解JAVA JDK动态代理机制