1.Proxy模式
package com.zj.proxy;
publicinterface Subject {
void operation1();
void operation2(String arg);
}
|
package com.zj.proxy;
publicclass RealSubject
implements Subject {
publicvoid operation1() {
System.out.println("Realer do operation1");
}
publicvoid operation2(String arg) {
System.out.println("Realer do operation2 with " + arg);
}
}
|
package com.zj.proxy;
publicclass ProxySubject
implements Subject {
private Subject
proxied;//
被代理對象
public ProxySubject(Subject proxied) {
this.proxied = proxied;
}
publicvoid operation1() {
System.out.println("Proxyer do operation1");
proxied.operation1();
}
publicvoid operation2(String arg) {
System.out.println("Proxyer do operation2 with " + arg);
proxied.operation2(arg);
}
}
|
package com.zj.proxy.client;
import com.zj.proxy.Subject;
import com.zj.proxy.RealSubject;
import com.zj.proxy.ProxySubject;
publicclass SimpleProxyDemo {
publicstaticvoid consumer(Subject
subject) {
subject.operation1();
subject.operation2("ZJ");
}
publicstaticvoid main(String[] args) {
RealSubject real =
new RealSubject();
System.out.println("===Without Proxy===");
consumer(real);
System.out.println("===Use Proxy===");
consumer(new ProxySubject(real));
}
}
|
package java.lang.reflect;
publicinterface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
|
package com.zj.proxy.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
publicclass DynamicProxyHandler
implements InvocationHandler {
private Object
proxied;
public DynamicProxyHandler(Object proxied) {
this.proxied = proxied;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("**** proxy: ****\n" + proxy.getClass()
+
"\nmethod: " + method + "\nargs: " + args);
if (args !=
null)
for (Object arg : args)
System.out.println("
" + arg);
return method.invoke(proxied, args);
}
}
|
package com.zj.proxy.client;
import java.lang.reflect.Proxy;
import com.zj.proxy.Subject;
import com.zj.proxy.RealSubject;
import com.zj.proxy.dynamic.DynamicProxyHandler;
publicclass DynamicProxyDemo {
publicstaticvoid consumer(Subject subject) {
subject.operation1();
subject.operation2("ZJ");
}
publicstaticvoid main(String[] args) {
RealSubject real =
new RealSubject();
System.out.println("===Without Proxy===");
consumer(real);
System.out.println("===Use Proxy===");
Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class
.getClassLoader(),
new Class[] { Subject.class },
new DynamicProxyHandler(real));
consumer(proxy);
}
}
|