什麼是代理模式(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();
}
}