Java 代理模式详解-2

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

51Testing软件测试网:QvV'f]0v&]~$@4O

  在上面的例子基础上,我们先添加一个通过短信来发送消息的处理类:51Testing软件测试网*W(`K4|5tG rd.r

^ly8?x_~+R5u051Testing软件测试网jb#R[ \(V7T.Uq:J

public class SmsMessage implements MessageHandler {51Testing软件测试网EJgF:{/p O
@Override
sP qNj8w-`0public void sendMessage(String msg) {
(M)U T*L q'Sb0// TODO Auto-generated method stub
&k,Ii7Fs%G0System.out.println("SMS Message :" + msg+" sent !");51Testing软件测试网%nKGm yu|Q Y4[y
}
_Z\1X6L%h0}
;bP l,\M*\2Y*z0//动态代理类51Testing软件测试网;^}#mO| V3d
import java.lang.reflect.InvocationHandler;51Testing软件测试网J V;iY7xy} \]cV
import java.lang.reflect.Method;51Testing软件测试网"^d"FOGQ$r
public class DynamicMessageProxy implements InvocationHandler {51Testing软件测试网0CFk;ySO9v*sq
private static int count;51Testing软件测试网En.tEzx8^"a.t
private MessageHandler msgHandler;
7l6g,u$E9Kb$zz0public DynamicMessageProxy(MessageHandler handler) {51Testing软件测试网Pq {{4IfO
msgHandler = handler;51Testing软件测试网8E)|y1iM1O |a
}
`/l#T#jym8T0@Override51Testing软件测试网%}sO Ym9A7J[w
public Object invoke(Object proxy, Method method, Object[] args)51Testing软件测试网G;r&jX1kW4\Y}N
throws Throwable {
(XaY }/oa0// TODO Auto-generated method stub51Testing软件测试网o1Y`7R(vL7xV6@
System.out.println("++++++++=============+++++++++");
/kV|8R6w7ok_p0System.out.println("proxy:" + proxy.getClass());51Testing软件测试网7Jt$Bj @7g}{
System.out.println("method:" + method);
"I1h[W V#@[E0System.out.println("++++++++=============+++++++++");51Testing软件测试网?};JU,^
if (args != null && args.length == 1 && checkMessage((String) args[0])) {
K2}~(^%~_o0vU%R0count++;51Testing软件测试网,pw ZYiO
System.out.println("Message sent:" + count);
sG~(DC PZ5O0return method.invoke(msgHandler, args);51Testing软件测试网n K Ih5_4g\
}51Testing软件测试网.? ]K&@4}?7z,A
return null;
a/p.XZp5a9|@A0}51Testing软件测试网HnR D-jc!a\:o
private boolean checkMessage(String msg) {51Testing软件测试网'K M5q"QPBp^
return msg != null && msg.length() > 10;
5j&k2p.]0Yl0Ik l(jp0}51Testing软件测试网Eq'hKs/h
}
/_-}6j+O?sC h8]m&NJ0//下面是调用
Y:k6M gR"X~#d(M.s Fr0import java.lang.reflect.Proxy;51Testing软件测试网3A1w~+B&Q~6l4a
public class MainClass {
CIx:]5q5F+z Z?P;?0private static void runProxy(MessageHandler handler) {
Z$a6M0F6nS0handler.sendMessage("message for test");51Testing软件测试网l;dtB)r5X o[j*c
}51Testing软件测试网{+p5J]9i3S
/**
*N ~^0bf+r8n0 * @param args51Testing软件测试网+^ h"t]4Vw
 */
.@HRJ8D2h0public static void main(String[] args) {51Testing软件测试网h vZ#u$ot,I6J
// TODO Auto-generated method stub
7AD4O3hK0// runProxy(new EmailMessage());
QZ$j~%ECrn `5g0// System.out.println("++++++++++++++++Proxy++++++++++++++++++");51Testing软件测试网pRpBq'v C3P4|J
// runProxy(new MessageProxy());51Testing软件测试网d'yG aYz,m%\/~
MessageHandler handler = new EmailMessage();51Testing软件测试网6@0_.c l y7lYN7X
runProxy(handler);
h [/m0E#lP6w~&?0MessageHandler proxy = (MessageHandler) Proxy.newProxyInstance(51Testing软件测试网:bti#z(_5e%} s
MessageHandler.class.getClassLoader(),51Testing软件测试网w8~ V(}X
new Class[] { MessageHandler.class }, new DynamicMessageProxy(
x"Z1b4l]0i0handler));51Testing软件测试网"m${/Bs Xn
runProxy(proxy);51Testing软件测试网:`4N \0@8`E%d+`_
System.out.println("++++++++++++++++++++++++++++++++++");51Testing软件测试网v b D@2z']:G
// 短信方式
TL0SrYd8D#`$@j;J0handler = new SmsMessage();
%o*gj2b+E fo$i$M1X0runProxy(handler);51Testing软件测试网!P;qj,f}sk
proxy = (MessageHandler) Proxy.newProxyInstance(MessageHandler.class51Testing软件测试网-Iq(y+W` s^
.getClassLoader(), new Class[] { MessageHandler.class },
E5fSW_0new DynamicMessageProxy(handler));
V*Y/rvL0runProxy(proxy);
!qxHD4QX]#IF0}
j J%] \?A$KD(o(b0}
X,T``~U?b0

D$](xNlW%STeF0  下面为以上方法的输出:51Testing软件测试网d%^0` zWe[ ~ ja

51Testing软件测试网'{'xlz.W

  message for test send!!51Testing软件测试网&t T"~ CE1j
  ++++++++=============+++++++++51Testing软件测试网&RW~4TkRn
  proxy:class $Proxy051Testing软件测试网+Ee$P ex-yu
  method:public abstract void MessageHandler.sendMessage(java.lang.String)51Testing软件测试网It/L3bI9[
  ++++++++=============+++++++++51Testing软件测试网;wLKp f
  Message sent:1
,qm2r!\{;G f9b0  message for test send!!
%d9g nFJ {-o0  ++++++++++++++++++++++++++++++++++51Testing软件测试网F-E]'F9B!~ C2wM7O
  SMS Message :message for test sent !
^l ^y(e"M%r+`4z.R`0  ++++++++=============+++++++++51Testing软件测试网7v~#qtn8k
  proxy:class $Proxy051Testing软件测试网]8z D M.g#J
  method:public abstract void MessageHandler.sendMessage(java.lang.String)51Testing软件测试网\ pT1u0e7h
  ++++++++=============+++++++++51Testing软件测试网'Q1w~*u!CnT J
  Message sent:2
EP#W-o.y3Z0  SMS Message :message for test sent !

M.G:h S2f9x$o0

0^P\ f@ X1Iu0  以上例子中,通过调用Proxy.newProxyInstance方法创建动态代理对象,该方法需要传入一个类加载器、一组希望代理实现的接 口列表、InvocationHandler 接口的一个具体实现。动态代理可以将所有调用重定向到调用处理器,通常我们会向该处理器传递一个时间对象的引用。invoke()方法中传递进来了代理对 象,当你需要区分请求来源时这是非常有用的,例如你可以通过判断传入的方法名屏蔽掉某些方法的执行!动态代理机制并不是会很频繁使用的方法,它通常用来解 决一些特定情况下的问题,因此不要盲目的为了使用而使用,要根据自己的实际需求来决定!51Testing软件测试网'J7P`g ]A


2O~ ~iX B8~U1tf0

TAG:

 

评分:0

我来说两句

Open Toolbar