一 简介
Proxy Pattern,23种java常用设计模式之一。代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
二 优点
(1).职责清晰
真实的角色就是实现实际的
业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在
客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性
三 模式结构
面向切面编程的代理
五 代码演示
抽象角色:
package DynamicProxy;
public interface Subject
{
public void request();
}
package DynamicProxy;
真实角色
public class RealSubject implements Subject
{
@Override
public void request()
{
System.out.println("From Real Subject");
}
}
代理角色:
package DynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxy implements InvocationHandler
{
private Object sub;
public DynamicProxy(Object obj)
{
sub = obj;
}
public void set(Object obj)
{
sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
System.out.println("The Calling Before ");
method.invoke(sub,args);
System.out.println("The Calling Next ");
return null;
}
}
//测试
package DynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client
{
public static void main(String[] args)
{
RealSubject real = new RealSubject();
DynamicProxy dynamic = new DynamicProxy(real);
InvocationHandler hander = dynamic;
Class<?> classType = hander.getClass();
Subject subject = (Subject)Proxy.newProxyInstance(classType.getClassLoader(),real.getClass().getInterfaces(),hander);
subject.request();
}
}
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
三 模式结构
一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理
对象实现同一个接口,先访问代理类再访问真正要访问的对象。
四 应用
对象实现同一个接口,先访问代理类再访问真正要访问的对象。
面向切面编程的代理
五 代码演示
抽象角色:
package DynamicProxy;
public interface Subject
{
public void request();
}
package DynamicProxy;
真实角色
public class RealSubject implements Subject
{
@Override
public void request()
{
System.out.println("From Real Subject");
}
}
代理角色:
package DynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxy implements InvocationHandler
{
private Object sub;
public DynamicProxy(Object obj)
{
sub = obj;
}
public void set(Object obj)
{
sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
System.out.println("The Calling Before ");
method.invoke(sub,args);
System.out.println("The Calling Next ");
return null;
}
}
//测试
package DynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client
{
public static void main(String[] args)
{
RealSubject real = new RealSubject();
DynamicProxy dynamic = new DynamicProxy(real);
InvocationHandler hander = dynamic;
Class<?> classType = hander.getClass();
Subject subject = (Subject)Proxy.newProxyInstance(classType.getClassLoader(),real.getClass().getInterfaces(),hander);
subject.request();
}
}
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象