什么是代理模式(Proxy)
- 为其他对象提供一种代理以控制对这个对象的访问
代理模式的几个角色
- Subject抽象主题角色,可以是一个抽象类或者接口,定义通用的业务
- RealSubject具体主题角色,被代理角色,是业务具体的执行者
- Proxy代理主题角色,也是委托类、代理类,负责对真实对象的应用,可以做预处理或者善后处理
- 示例代码(示例中包括基本的代理模式、强制代理、动态代理)
- 基本的代理模式
package com.pattern.proxy.base;
/**
* 接口类,所有的具体Subject都要实现这个接口
* @author yjzhou
*/
public interface Subject {
public void request();
}
package com.pattern.proxy.base;
/**
* 具体的subject类,实现完成Subject接口中的方法
* @author yjzhou
*/
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("具体主题类执行request----");
}
}
package com.pattern.proxy.base;
/**
* 代理类,代理处理Subject类的request的方法
* @author yjzhou
*/
public class ProxySubject implements Subject{
private Subject subject;
/**
* 通过构造函数传递被代理者
* @param subject
*/
public ProxySubject(Subject subject) {
this.subject = subject;
}
@Override
public void request() {
before();
subject.request();
after();
}
/**
* 预处理
*/
private void before(){
System.out.println("代理执行前的预处理-----");
}
/**
* 后处理
*/
private void after(){
System.out.println("代理执行完成后的处理-----");
}
}
package com.pattern.proxy.base;
/**
* 基本的代理模式测试类
* @author yjzhou
*/
public class TestProxy {
public static void main(String[] args) {
ProxySubject proxy = new ProxySubject(new RealSubject());
proxy.request();
RealSubject realSubject = new RealSubject();
realSubject.request();
}
}
- 强制代理
package com.pattern.proxy.force;
public interface Subject {
public void request();
public Subject getProxy();
}
package com.pattern.proxy.force;
public class RealSubject implements Subject {
private ProxyForce proxy = null;
public RealSubject() {
// TODO Auto-generated constructor stub
}
@Override
public void request() {
if (isProxy()) {
System.out.println("具体主题执行reques------");
} else {
System.out.println("请使用指定代理访问----");
}
}
@Override
public Subject getProxy() {
this.proxy = new ProxyForce(this);
return this.proxy;
}
private boolean isProxy() {
if (null == this.proxy) {
return false;
} else {
return true;
}
}
}
package com.pattern.proxy.force;
public class ProxyForce implements Subject{
private Subject subject;
public ProxyForce(Subject subject) {
this.subject = subject;
}
@Override
public void request() {
before();
subject.request();
after();
}
@Override
public Subject getProxy() {
return this;
}
/**
* 预处理
*/
private void before(){
System.out.println("代理执行前的预处理-----");
}
/**
* 后处理
*/
private void after(){
System.out.println("代理执行完成后的处理-----");
}
}
package com.pattern.proxy.force;
public class TestProxyForce {
public static void main(String[] args) {
//需要代理才能操作
RealSubject realSubject = new RealSubject();
realSubject.request();
System.out.println("---------------------------------------");
//不是指定的代理,同样无法操作
ProxyForce proxyForce = new ProxyForce(realSubject);
proxyForce.request();
System.out.println("---------------------------------------");
//获得代理正确操作
Subject proxy = realSubject.getProxy();
proxy.request();
System.out.println("---------------------------------------");
}
}
- 动态代理
package com.pattern.proxy.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DyProxyHandler implements InvocationHandler{
private Object obj = null;
public DyProxyHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(obj, args);
return result;
}
}
package com.pattern.proxy.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.pattern.proxy.base.RealSubject;
import com.pattern.proxy.base.Subject;
public class TestDyProxy {
public static void main(String[] args) {
Subject subject = new RealSubject();
InvocationHandler handler = new DyProxyHandler(subject);
Class<?> cls = subject.getClass();
Subject proxySubject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces() , handler);
proxySubject.request();
}
}