1、定义及作用
代理模式给某一对象提供一个代理对象,并由代理对象来控制对原对象的使用。通过该模式可以控制客户端和目标对象间的作用关系。
2、涉及角色
抽象角色:真实对象和代理对象的共同接口。
代理角色:实现了抽象角色以代替客户端中的真实角色。在代理角色内部含有对真实角色的引用,在执行真实角色的动作时执行额外的动作。
真实角色:客户端实际引用的对象,也即代理角色代理的对象。
3、简单实现
抽象角色java 代码
- package proxy;
-
-
-
-
-
- public interface AbstractSubject {
-
-
-
-
- public void say();
-
- }
- package proxy;
-
-
-
-
-
- public class RealSubject implements AbstractSubject{
-
- public void say() {
-
- System.out.println("RealSubject.say():"+"这是真实角色方法!");
- }
-
- }
- package proxy;
-
-
-
-
-
-
- public class ProxySubject implements AbstractSubject {
-
- private RealSubject realSubject;
-
- public ProxySubject() {
- }
-
- public ProxySubject(RealSubject realSubject) {
- this.realSubject = realSubject;
- }
-
- private void preRequest() {
- System.out.println("请求前预处理:ProxySubject.preRequest()");
- }
-
- private void afterRequest() {
- System.out.println("请求处理完毕后动作:ProxySubject.afterRequest()");
- }
-
- public void say() {
-
- preRequest();
-
- if (realSubject == null) {
- realSubject = new RealSubject();
- }
- realSubject.say();
-
- afterRequest();
-
- }
-
- }
- package proxy;
-
-
-
-
-
- public class TestProxy {
-
-
-
-
- public static void main(String[] args) {
-
- AbstractSubject abstractSubject = new ProxySubject();
-
- abstractSubject.say();
-
-
-
-
-
-
-
- }
-
- }
4、java动态代理
顾名思义,在运行时java动态生成代理类。给定一组代理的接口,通过java动态代理机制将动态生成含有这些接口的代理类。涉及到接口java.lang.reflect.InvocationHandler和类java.lang.reflect.Proxy。所有代理类模板都必须实现接口InvocationHandler,通过Proxy的静态方法newProxyInstance(ClassLoader
loader,Class[] interfaces,InvocationHandler h)来动态生成代理类实例。
动态代理java 代码
- package proxy;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
-
-
-
-
-
- public class JavaDynamicProxy implements InvocationHandler{
-
- private Object prObject;
-
- public JavaDynamicProxy(Object prObject){
- this.prObject = prObject;
- }
-
-
-
-
-
- public static Object factory(Object object){
- Class cls = object.getClass();
-
- return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new JavaDynamicProxy(object));
- }
-
-
-
- public static void main(String[] args) {
-
-
- AbstractSubject abstractSubject = (AbstractSubject)factory(new RealSubject());
-
- abstractSubject.say();
-
-
-
-
-
-
-
- }
-
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-
- System.out.println("调用真实对象之前。。。。。");
-
- method.invoke(prObject, args);
-
- System.out.println("调用真实对象之前。。。。。");
- return null;
- }
-
- }
|