代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
-
抽象角色:声明真实对象和代理对象的共同接口
-
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
-
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
动态代理:以java jdk API实现代理为例
第一步:创建接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.txmwzl.jdk; /** *
销售接口 *
@author 政霖 * */ public interface SaleAgency
{ /** *
销售火车票函数 */ public void saleTicket(); } |
第二步:创建将被代理的主体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package com.txmwzl.jdk; /** *
火车站售票处类 *
@author 政霖 * */ public class TrainStationSaleOffice implements SaleAgency
{ @Override public void saleTicket()
{ System.out.println( "火车站售票处打印火车票中" ); } } |
第三步:创建代理类事务处理类(继承InvocationHandler接口)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package com.txmwzl.jdk; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** *
火车站代售处事务处理类 *
@author 政霖 * */ public class TrainTicketBookStore implements InvocationHandler
{ public TrainStationSaleOffice
trainStationSaleOffice ; public void setTrainStationSaleOffice(TrainStationSaleOffice
trainStationSaleOffice) { this .trainStationSaleOffice
= trainStationSaleOffice; } @Override public Object
invoke(Object arg0, Method method, Object[] arg2) throws Throwable
{ System.out.println( "火车票代售处老板在火车站售票处帮你买票" ); System.out.println(method); method.invoke(trainStationSaleOffice); System.out.println( "火车票代售处老板在回来的路上" ); return null ; } } /* 为什么需要动态代理 1.为何不直接使用继承,静态代理 { 1.相比继承,静态代理,代理可以减少编码量,
例如在切面编程中,也是通过动态代理实现的,如果使用继承,每个切面都需要继承,重写,效果无法实现 2.动态代理依靠动态加载类机制实现,编译期类不可知。 3.动态代理是静态代理更高层的抽象,代理可以达到集中目标类的功能开发,符合现实中各司其职的现实意义 } */ |
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.txmwzl.jdk; import java.lang.reflect.Proxy; public class Main
{ public static void main(String[]
args) { TrainStationSaleOffice
trainStationSaleOffice = new TrainStationSaleOffice(); TrainTicketBookStore
ticketBookStore = new TrainTicketBookStore(); ticketBookStore.setTrainStationSaleOffice(trainStationSaleOffice); SaleAgency
agency = (SaleAgency)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), ticketBookStore); agency.saleTicket(); } } |