Java 代理模式详解-2
上一篇 /
下一篇 2012-09-21 13:21:33
/ 个人分类:Java
&I
E,\5Z*g%[
N+d0 在上面的例子基础上,我们先添加一个通过短信来发送消息的处理类:
_(bw8j(D9AADv051Testing软件测试网eC*Mgr51Testing软件测试网V4kq5h(b+Ve9yA
public class SmsMessage implements MessageHandler {51Testing软件测试网z!dgh [E
@Override
5oP2z4[!{5xvV0public void sendMessage(String msg) {
|
pVjx[0// TODO Auto-generated method stub
)M&SY$Uv j0System.out.println("SMS Message :" + msg+" sent !");51Testing软件测试网:k u'aN
H!?Cg
}
WD
|V5U7]5n0}51Testing软件测试网&?b%U6J@8r
//动态代理类
@[-J-O B3q!O5s+F0import java.lang.reflect.InvocationHandler;51Testing软件测试网 SEQ
sd!l
import java.lang.reflect.Method;51Testing软件测试网#i [v8Z"i:Gu*g
public class DynamicMessageProxy implements InvocationHandler {51Testing软件测试网/^ien!Y
B
private static int count;
At"Ef@6o0y-F%Ml0private MessageHandler msgHandler;51Testing软件测试网$bhP%m9r-c
public DynamicMessageProxy(MessageHandler handler) {
5D b#ltte xJ J.YB#K0msgHandler = handler;
c
u(smC&v"S3M0}
|0b6YAu:ka}0@Override
W j@:s#?$To/Z0public Object invoke(Object proxy, Method method, Object[] args)51Testing软件测试网"p9K!E!`pD`\ Y4p
throws Throwable {51Testing软件测试网$dXnC0?}
// TODO Auto-generated method stub
cW6A1L)^2Vq#HZ0System.out.println("++++++++=============+++++++++");51Testing软件测试网3C7v{A-Xf;p R8vZ!u
System.out.println("proxy:" + proxy.getClass());
Zp7~:NE0System.out.println("method:" + method);
rr,xN#eqM'W:@0System.out.println("++++++++=============+++++++++");51Testing软件测试网j_K.V"j;e
if (args != null && args.length == 1 && checkMessage((String) args[0])) {
W.h
TX8H0count++;
hu*u
Y H0System.out.println("Message sent:" + count);51Testing软件测试网(f_ W@6T^
return method.invoke(msgHandler, args);51Testing软件测试网k%xw(})w6}1U}
}
6jJ
Iw;XRyp0return null;51Testing软件测试网
A&Aywr+aO
}
4D'}-[,}1}O/b0private boolean checkMessage(String msg) {
gj]-@D4\0return msg != null && msg.length() > 10;51Testing软件测试网&q"j;Z8q"v:t.r
}51Testing软件测试网+wa^L2ff&K
}51Testing软件测试网,Z!}$c#@^+{~
//下面是调用
'mT'U2R/TsU#cK%`']p0import java.lang.reflect.Proxy;
BFi@)R4b
xT
x;c,qO0public class MainClass {51Testing软件测试网 O&Y6E
WuJ_-}{
private static void runProxy(MessageHandler handler) {
6b{o8O0g6GD4ph-oC3}(]0handler.sendMessage("message for test");51Testing软件测试网V2?2JWq'y,F(F2[
}51Testing软件测试网
JNl%fd}(T
/**
.Q;z;HC S)f,Ti0 * @param args51Testing软件测试网4u)|+F)} sm6g
*/
J2e Y5L:n/_(UF-o0public static void main(String[] args) {
S@,S,H-GN,Yt0// TODO Auto-generated method stub
G1e@ gZ?R}d^0// runProxy(new EmailMessage());51Testing软件测试网'Y%Xlk3R7e
o
// System.out.println("++++++++++++++++Proxy++++++++++++++++++");
f
n!U:b&\|Q3VP4|H0// runProxy(new MessageProxy());51Testing软件测试网nT7o
oQ\e!lo
MessageHandler handler = new EmailMessage();51Testing软件测试网3d~:RhW
runProxy(handler);51Testing软件测试网+m7Uiy1X5c
MessageHandler proxy = (MessageHandler) Proxy.newProxyInstance(
|)j&|A)Y1]XW;vL0MessageHandler.class.getClassLoader(),51Testing软件测试网Rf^2jc"[%eG|C#K-^@
new Class[] { MessageHandler.class }, new DynamicMessageProxy(51Testing软件测试网+n-t(z8c+cs4RR8dsY
handler));51Testing软件测试网4sQ}5Q0X
runProxy(proxy);51Testing软件测试网+J0{vG}X Qo
System.out.println("++++++++++++++++++++++++++++++++++");51Testing软件测试网o ]%c0g1Pn+Pp
// 短信方式
-mn*XG0k*m0handler = new SmsMessage();
9w|gb8y_^+b2}
l0runProxy(handler);
*c4gF+Fhz_0proxy = (MessageHandler) Proxy.newProxyInstance(MessageHandler.class51Testing软件测试网0n!{:WhV'c][
.getClassLoader(), new Class[] { MessageHandler.class },
c8W?r4H^4C3?y0new DynamicMessageProxy(handler));51Testing软件测试网]
u5Jc1A?
runProxy(proxy);
0rF3?or
@?D:_0}51Testing软件测试网-@uW'M2c,q
}51Testing软件测试网:lhn[5|L5l
51Testing软件测试网,`Oz!By 下面为以上方法的输出:51Testing软件测试网;UQDk&QP}"]#P9P?
51Testing软件测试网WU'OJ? message for test send!!
&c"n h
d}H9lh*b0 ++++++++=============+++++++++
*nn4O-_"wh2c0 proxy:class $Proxy051Testing软件测试网z*|2@q3In4nn
method:public abstract void MessageHandler.sendMessage(java.lang.String)51Testing软件测试网
f Q Spf
M P!`
++++++++=============+++++++++
`w*}@ F,F0 Message sent:151Testing软件测试网&Qzvg&`Z
message for test send!!51Testing软件测试网?W*K9wJYm$^
++++++++++++++++++++++++++++++++++51Testing软件测试网6D)WMW;f)tO
SMS Message :message for test sent !
,V*KbR+j,DBt0 ++++++++=============+++++++++
z GH@I4gc%M(D/W~0 proxy:class $Proxy051Testing软件测试网z:W"q$SF
method:public abstract void MessageHandler.sendMessage(java.lang.String)51Testing软件测试网,?,oyO"S6V/z
++++++++=============+++++++++51Testing软件测试网bAzLaIX:q1\w$U!s
Message sent:2
7o1{frAg4d0 SMS Message :message for test sent !
%k,KT^/N+F3bO\)BH[0&f1^jha(rt0 以上例子中,通过调用Proxy.newProxyInstance方法创建动态代理对象,该方法需要传入一个类加载器、一组希望代理实现的接
口列表、InvocationHandler
接口的一个具体实现。动态代理可以将所有调用重定向到调用处理器,通常我们会向该处理器传递一个时间对象的引用。invoke()方法中传递进来了代理对
象,当你需要区分请求来源时这是非常有用的,例如你可以通过判断传入的方法名屏蔽掉某些方法的执行!动态代理机制并不是会很频繁使用的方法,它通常用来解
决一些特定情况下的问题,因此不要盲目的为了使用而使用,要根据自己的实际需求来决定!
X{(`+Y8]051Testing软件测试网#q)nO GJ3mg
收藏
举报
TAG: