GoF著作中未提到的設計模式(1): Archetype

GoF著作中未提到的設計模式(1):Archetype
  半天也沒能給這個設計模式想出一箇中文名稱,算了,有時候還是原版的更容易理解。

  簡單地說,Archetype設計模式的目的是將業務處理邏輯和具體實現分離,所以至少需要兩個參與者:Decorator和Delegate,
它們都實現同一個接口,Decorator負責處理業務邏輯,而Delegate負責具體的實現,在Decorator的通用業務邏輯
處理過程中,會把具體實現委派給Delegate。
(注:這裏的Decorator並不是指”裝飾者“設計模式)

  咱們還是用個例子講吧,假設系統中有一個記錄各種事件的接口:
public interface EventRecorder{
// 記錄事件的內容
public void record(String event);
}

  引入兩個抽象類來達到處理邏輯和具體實現分離的目的:
 
複製代碼
public abstract class EventRecorderDecorator implements EventRecorder{
protected EventRecorderDelegate delegate;

public void setDelegate(EventRecorderDelegate delegate){
this.delegate = delegate;
}
}

public abstract class EventRecorderDelegate implements EventRecorder{

}
複製代碼

  下面是兩個簡單的邏輯處理(Decorator)類:
複製代碼

// 簡單的事件記錄類
public class SimpleEventRecorder extends EventRecorderDecorator{

public void record(String event){
// 附加當前的日期到事件的內容中
event = getDate() + event;
// 當內容過長時省略顯示
event = ellipseText(event);
// 記錄事件的內容
delegate.record(event);
}
}

// 複雜的事件記錄類
public class ComplicateEventRecorder extends EventRecorderDecorator{

public void record(String event){
// 附加當前的日期到事件的內容中
event = getDate() + event;
// 附加當前異常信息到事件的內容中
event = event+getExceptionText();
// 附加當前的內存、CPU佔用率到事件的內容中
event = event+getMachineStatus();
// 當內容過長時省略顯示
event = ellipseText(event);
// 記錄事件的內容
delegate.record(event);
}
}
複製代碼

  可以看到,最後一步都交給了EventRecorderDelegate對象,這一步就是之前所說的“具體實現”,有以下幾種記錄事件內容的可能性:
1、記錄到數據庫中
2、記錄到本地文件中
3、通過郵件發送
4、發送到遠程服務器中
  所以我們需要新建四個EventRecorderDelegate的派生類來實現這些記錄方式:
 
複製代碼
public class RecordEventToDatabase extends EventRecorderDelegate{
public void record(String event){
// 將記錄寫入到數據庫中
}
}

public class RecordEventToFile extends EventRecorderDelegate{
public void record(String event){
// 將記錄寫入到文件中
}
}

public class RecordEventByEmail extends EventRecorderDelegate{
public void record(String event){
// 將記錄發送到指定的郵箱
}
}

public class RecordEventToRemoteServer extends EventRecorderDelegate{
public void record(String event){
// 將記錄發送到遠程服務器上
}
}
複製代碼

  下面是一個生成事件記錄對象的工廠:
 
複製代碼
public class EventRecorderFactory{

public static EventRecorder create(int type, int flag){
EventRecorderDelegate delegate
= null;
EventRecorderDecorator decorator
= null;

if(type == 0)
decorator
= new SimpleEventRecorder();
if(type == 1)
decorator
= new ComplicateEventRecorder();

if(flag == 0)
delegate
= new RecordEventToDatabase();
if(flag == 1)
delegate
= new RecordEventToFile();
if(flag == 2)
delegate
= new RecordEventByEmail();
if(flag == 3)
delegate
= new RecordEventToRemoteServer();
// 設置代理
decorator.setDelegate(delegate);
}
}
複製代碼

  從我們舉的例子中可以看到,有2種業務處理邏輯,有4個具體實現,它們組成了8種事件記錄方式,另外,4個具體實現單獨使用的話又有4種記錄方式,實際上有12種事件記錄方式。
  
發佈了27 篇原創文章 · 獲贊 20 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章