代理模式(Proxy Pattern)
代理模式是软件设计模式中的一种基本技巧。代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
一般包括三部分:
1.抽象角色:真实对象和代理对象的共同接口
2.真实角色:真实处理请求的目标对象
3.代理角色:代理对象角色内部含有真实对象的引用,从而代理对象可以将请求转化为真实对象处理。同事,代理对象在执行真实对象操作的前后还可以添加附加操作。
举例:红酒代理商
抽象角色
真实角色
代理角色
客户
输出结果
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
以上为静态代理
JDK中引入的动态代理机制:
抽象角色
真实角色
客户
代理模式是软件设计模式中的一种基本技巧。代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
一般包括三部分:
1.抽象角色:真实对象和代理对象的共同接口
2.真实角色:真实处理请求的目标对象
3.代理角色:代理对象角色内部含有真实对象的引用,从而代理对象可以将请求转化为真实对象处理。同事,代理对象在执行真实对象操作的前后还可以添加附加操作。
举例:红酒代理商
抽象角色
public interface IRedWine {
public void product();
}
真实角色
public class RealRedWineFactory implements IRedWine{
@Override
public void product() {
System.out.println("生产红酒");
}
}
代理角色
public class RedWineProxy implements IRedWine{
private IRedWine redWineFactory;
public RedWineProxy(IRedWine redWineFactory){
this.redWineFactory=redWineFactory;
}
@Override
public void product() {
redWineFactory.product();
System.out.println("代理转售");
}
}
客户
public class Client {
public static void main(String[] args) {
IRedWine redWine=new RealRedWineFactory();
RedWineProxy redWineProxy=new RedWineProxy(redWine);
redWineProxy.product();
}
}
输出结果
生产红酒
代理转售
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
以上为静态代理
JDK中引入的动态代理机制:
抽象角色
public interface IRedWine {
public void product();
}
真实角色
public class RealRedWineFactory implements InvocationHandler{
/**
* description
* @param proxy 被代理的对象
* @param method 要调用的方法
* @param args 方法调用时所需要的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("生产红酒");
System.out.println("代理转售");
return null;
}
}
客户
public class Client {
public static void main(String[] args) {
//真实角色
InvocationHandler invocationHandler=new RealRedWineFactory();
//创建代理对象
IRedWine redWine=(IRedWine) Proxy.newProxyInstance(IRedWine.class.getClassLoader(), new Class[]{IRedWine.class},invocationHandler);
redWine.product();
}
}