設計模式入門:代理模式

原文地址:http://te-amo.site/user/article/info/ARTICLE20180422043104194
文章中部分定義和解釋性文字,都是引用百度百科,主要的代碼及場景應用爲本人原創

代理模式爲其他對象提供一種代理以控制對這個對象的訪問。代理對象在客戶端和目標對象之間起到中介的作用。

場景:在一個系統中有個統計服務,當進行統計服務之前需要檢查並開啓需要統計的資源,統計完成後需要關閉不必要的資源,避免浪費服務器資源。對於這一個需求可以使用代理模式來設計,在統計之前和之後所做的事情很統計服務本身沒有太多關係,採用這種模式可以解耦,同時也使得需要統計的資源可配置,提高靈活性。

構成

  • 抽象角色:通過接口或抽象類聲明真實角色實現的業務方法。(Statistics)
  • 代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。(ProxyStatistics)
  • 真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。(RealStatistics)

設計

這裏寫圖片描述

實現

代碼地址:https://github.com/telundusiji/designpattern

抽象角色 統計接口

public interface Statistics {
    void statistics();
}

真實角色 統計實現

@Slf4j
public class RealStatistics implements Statistics {
    @Override
    public void statistics() {
        log.info("開始統計......");
        log.info("統計完成!");
    }
}

靜態代理的方式 代理角色 統計代理

@Slf4j
public class ProxyStatistics implements Statistics{

    private RealStatistics realStatistics;

    public ProxyStatistics(RealStatistics realStatistics){
        this.realStatistics = realStatistics;
    }

    @Override
    public void statistics() {
        log.info("統計前,開啓需要統計的服務");
        realStatistics.statistics();
        log.info("統計結束,關閉服務!");
    }
}

動態代理方式(代理角色是動態生成,所以這並不是代理角色)

@Slf4j
public class DynamicProxyStatisticsHandler implements InvocationHandler {

    private RealStatistics realStatistics;

    public DynamicProxyStatisticsHandler(RealStatistics realStatistics) {
        this.realStatistics = realStatistics;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(realStatistics,args);
        after();
        return null;
    }

    private void before() {
        log.info("統計前,開啓需要統計的服務");
    }

    private void after() {
        log.info("統計結束,關閉服務!");
    }
}

優點

  • 職責清晰:真實的角色是實現實際的業務邏輯,不用關心其他非本職責的事務。
  • 代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。

java中的靜態代理和動態代理可以閱讀以下文章:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章