代理模式

定義

爲其他對象提供一種代理以控制對這個對象的訪問

角色定義

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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章