定義
爲其他對象提供一種代理以控制對這個對象的訪問
角色定義
1. Subject抽象主題角色
抽象主題類可以是抽象類也可以是接口,是一個最普通的業務類型定義,無特殊要求.
2. RealSubject具體主題角色
也叫做被委託角色,被代理角色.
3. Proxy代理主題角色
代理類
優點
1. 職責清晰
2. 高擴展性
3. 智能代
通用代碼
抽象主題類
public interface Subject {
void doSomething();
}
真實主題類
public class RealSubject implements Subject {
@Override
public void doSomething() {
}
}
代理類
public class Proxy implements Subject {
private Subject subject ;
public Proxy() {
Subject = new RealSubject();
}
public Proxy(Subject subject) {
this.subject = subject;
}
private void after(){
}
private void before(){
}
@Override
public void doSomething() {
before();
realSubject.doSomething();
after();
}
}
普通代理
調用才只知代理而不用知道真實的角色是誰,屏蔽了真實角色的變更對高層模塊的影響,真實的主題角色想怎麼修改變怎麼修改,對高層次的模塊沒有任何的影響.
抽象主題類
public interface Subject {
void doSomething();
}
真實主題類
public class RealSubject implements Subject {
public RealSubject(Subject subject) {
if(subject ==null){
throw new RuntimeException("不能創建");
}
}
@Override
public void doSomething() {
}
}
代理類
public class Proxy implements Subject {
private Subject subject ;
public Proxy() {
subject = new RealSubject(this);
}
public Proxy(Subject subject) {
this.subject = subject;
}
private void after(){
}
private void before(){
}
@Override
public void doSomething() {
before();
realSubject.doSomething();
after();
}
}
強制代理
強制代理的概念就是要從真實角色查找到代理角色,不允許直接訪問真實角色.
抽象主題類
public interface Subject {
void doSomething();
Subject getProxy();
}
真實主題類
public class RealSubject implements Subject {
public Subject proxy ;
@Override
public void doSomething() {
if(!isProxy()){
throw new RuntimeException("請使用代理");
}
}
@Override
public Subject getProxy() {
proxy = new Proxy(this);
return proxy;
}
private boolean isProxy(){
return proxy != null;
}
}
代理類
public class Proxy implements Subject {
private Subject subject ;
public Proxy(Subject subject) {
this.subject = subject;
}
private void after(){
}
private void before(){
}
@Override
public void doSomething() {
before();
subject.doSomething();
after();
}
@Override
public Subject getProxy() {
return this;
}
}
動態代理(JDK)
JDK動態代理首要條件是:被代理類必須實現一個接口
抽象主題
public interface Subject {
void doSomething();
}
真實主題
public class RealSubject implements Subject {
@Override
public void doSomething() {
}
}
通知接口
public interface Advice {
void exec();
}
通知實現
public class BeforAdvice implements Advice {
@Override
public void exec() {
}
}
動態代理Handler類
public class DynamicProsy<T> {
public static <T> T newProxyInstance(ClassLoader classLoader,Class<?>[] interfaces,InvocationHandler handler){
new BeforAdvice().exec();
return (T)Proxy.newProxyInstance(classLoader,interfaces,handler);
}
}
具體業務動態代理
public class SubjectDynamicProxy extends DynamicProsy {
public static <T> T newProxyInstance(Subject subject) {
ClassLoader classLoader = subject.getClass().getClassLoader();
Class<?>[] classes = subject.getClass().getInterfaces();
InvocationHandler handler = new MyInvocationHandler(subject);
return newProxyInstance(classLoader, classes, handler);
}
}
場景類
public class Client {
public static void main(String[] args) {
Subject subject = new RealSubject();
Subject proxy = SubjectDynamicProxy.newProxyInstance(subject);
proxy.doSomething();
}
}