代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是经过调用代理,来间接的调用实际的对象。html
参考现实生活中的代理设计模式
好比某个品牌的某个省的代理商,做为客户咱们只会跟省代理这边买东西,而不会直接跟厂商接触。这里的代理,是商家代理了品牌。服务器
所谓正向代理和反向代理,就要理解正向和反向。ide
这里的方向,我的理解是调用发生的方向。this
正向代理:.net
反向代理:设计
隐藏了真实的服务端;代理
反向代理为什么叫反向代理?code
经过聚合/注入的模式,拆分调用,分为静态代理和动态代理。htm
代码体现
public interface Subject { void visit(); } public class RealSubject implements Subject { private String name = "byhieg"; @Override public void visit() { System.out.println(name); } } public class ProxySubject implements Subject{ private Subject subject; public ProxySubject(Subject subject) { this.subject = subject; } @Override public void visit() { subject.visit(); } } public class Client { public static void main(String[] args) { ProxySubject subject = new ProxySubject(new RealSubject()); subject.visit(); } }
动态代理和静态代理的不一样,主要体如今
其中代理类的实现是关键,即从直接写死到动态生成;
动态生成,一方面须要写动态代理的声明,而后实例化
public class DynamicProxy implements InvocationHandler { private Object object; public DynamicProxy(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(object, args); return result; } } Subject realSubject = new RealSubject(); DynamicProxy proxy = new DynamicProxy(realSubject); ClassLoader classLoader = realSubject.getClass().getClassLoader(); Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, proxy); subject.visit();