上文(設計模式-訪問者模式):https://blog.csdn.net/qq_16498553/article/details/106934637
目錄
源碼下載:https://gitee.com/hong99/design-model/issues/I1IMES
源碼下載:https://gitee.com/hong99/design-model/issues/I1IMES
背景
一般在企業裏面各個部門都有一個負責人,如果有什麼事直接接這個負責人就可以了,而這個負責起到一個對外暴露的作用,有什麼事直接找負責人。
業務代表模式是什麼?
業務代表模式(Business Delegate Pattern)用於對錶示層和業務層解耦。它基本上是用來減少通信或對錶示層代碼中的業務層代碼的遠程查詢功能。在業務層中我們有以下實體。
角色:
客戶端(client):表示層可以是html、jsp、servlet或java的UI代碼。
業務代表(Business Delegate): 一個爲客戶端實體提供的入口類,它提供了對業務服務方法的訪問。
查詢服務(LookUp Service):查找服務對象負責獲取相關的業務實現,並提供業務對象對業務代表對象的訪問。
業務服務(Business Service): 業務服務接口。實現了該業務服務的實體類,提供了實際的業務實現邏輯。
優點:
低耦合高靈活:減少系統之間的相互依賴;
高內聚:有問題外部也是不知道的,只會怪接口,所以內部好處理掉這些問題。
缺點:
不符合開閉原則,增刪改可能影響原來功能和流程;
業務代表模式可以幹嘛?
業務代表模式主要解決一個是直接將業務交給業務代表去調用,當然所有的內部接口都向業務代表暴露,通過業務代表統一去操作,起到一個作用是用戶不會直接面對內部系統而是面對。
個人理解:
該模式有點類似於門面模式,統一由一個負責人來面對客戶,然後進行操作。
業務代表模式類圖
源碼下載:https://gitee.com/hong99/design-model/issues/I1IMES
實現代碼
/**
* @Auther: csh
* @Date: 2020/6/23 17:08
* @Description: 業務代表(Business Delegate)
*/
public class BusinessDelegate {
private BusinessLookUp lookUp = new BusinessLookUp();
private BusinessService businessService;
private String serviceType;
public void setServiceType(String serviceType) {
this.serviceType = serviceType;
}
public void doTask(){
businessService = lookUp.getBusinessService(serviceType);
businessService.doProcessing();
}
}
/**
*
* 功能描述:抽象業務接口
*
* @param:
* @return:
* @auther: csh
* @date: 2020/6/23 18:30
*/
public interface BusinessService {
public void doProcessing();
}
/**
*
* 功能描述:查詢服務(LookUp Service)
*
* @param:
* @return:
* @auther: csh
* @date: 2020/6/23 18:30
*/
public class BusinessLookUp {
public BusinessService getBusinessService(String serviceType){
if(serviceType.equalsIgnoreCase("EJB")){
return new EJBService();
}else {
return new JMSService();
}
}
}
/**
*
* 功能描述:Business Service
*
* @param:
* @return:
* @auther: csh
* @date: 2020/6/23 18:30
*/
public class EJBService implements BusinessService {
@Override
public void doProcessing() {
System.out.println("Processing task by invoking EJB Service");
}
}
/**
*
* 功能描述:業務接口(Business Service)
*
* @param:
* @return:
* @auther: csh
* @date: 2020/6/23 18:30
*/
public class JMSService implements BusinessService {
@Override
public void doProcessing() {
System.out.println("Processing task by invoking JMS Service");
}
}
/**
* @Auther: csh
* @Date: 2020/6/23 17:09
* @Description: 客服端(client)
*/
public class Client {
BusinessDelegate businessDelegate;
public Client(BusinessDelegate businessDelegate) {
this.businessDelegate = businessDelegate;
}
public void doTask(){
businessDelegate.doTask();
}
}
/**
* @Auther: csh
* @Date: 2020/6/23 17:10
* @Description:由具體業務代表來調用業務
*/
public class Test {
public static void main(String[] args) {
BusinessDelegate businessDelegate = new BusinessDelegate();
businessDelegate.setServiceType("EJB");
Client client = new Client(businessDelegate);
client.doTask();
businessDelegate.setServiceType("JMS");
client.doTask();
}
}
結果
Processing task by invoking EJB Service
Processing task by invoking JMS Service
源碼下載:https://gitee.com/hong99/design-model/issues/I1IMES
最後
業務代表模式,非常類似於門面模式的思想,同樣是由一個負責人在前面,面對用戶,而後端的接口只暴露給該負責人,當然一樣的問題中心節點一但出問題整個系統就GG了,雖然說起到高內聚作用。