Java 代理模式详解-2

上一篇 / 下一篇  2012-09-21 13:21:33 / 个人分类:Java

&I E,\5Z*g%[ N+d0  在上面的例子基础上,我们先添加一个通过短信来发送消息的处理类:

_(bw8j(D9AADv051Testing软件测试网eC*Mgr

51Testing软件测试网V4k q5h(b+Ve9yA

public class SmsMessage implements MessageHandler {51Testing软件测试网z!dgh [E
@Override
5oP2z4[!{5x vV0public void sendMessage(String msg) {
| p Vj x[0// TODO Auto-generated method stub
)M&SY$Uv j0System.out.println("SMS Message :" + msg+" sent !");51Testing软件测试网:k u'aN H!?Cg
}
W D |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:G u*g
public class DynamicMessageProxy implements InvocationHandler {51Testing软件测试网/^ien!Y B
private static int count;
At"Ef@6o0y-F%M l0private MessageHandler msgHandler;51Testing软件测试网$bhP%m9r-c
public DynamicMessageProxy(MessageHandler handler) {
5D b#lt te xJJ.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;pR8vZ!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/T sU#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?2J Wq'y,F(F2[
}51Testing软件测试网 JNl%fd}(T
/**
.Q;z;HCS)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+c s4RR8dsY
handler));51Testing软件测试网4s Q}5Q0X
runProxy(proxy);51Testing软件测试网+J0{vG}XQo
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软件测试网-@u W'M2c,q
}51Testing软件测试网:lhn[5| L5l
51Testing软件测试网,`O z!By

  下面为以上方法的输出:51Testing软件测试网;UQ Dk&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软件测试网 fQ 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:

 

评分:0

我来说两句

Open Toolbar