GoF著作中未提到的設計模式(1):Archetype
半天也沒能給這個設計模式想出一箇中文名稱,算了,有時候還是原版的更容易理解。
簡單地說,Archetype設計模式的目的是將業務處理邏輯和具體實現分離,所以至少需要兩個參與者:Decorator和Delegate,
它們都實現同一個接口,Decorator負責處理業務邏輯,而Delegate負責具體的實現,在Decorator的通用業務邏輯
處理過程中,會把具體實現委派給Delegate。
(注:這裏的Decorator並不是指”裝飾者“設計模式)
咱們還是用個例子講吧,假設系統中有一個記錄各種事件的接口:
引入兩個抽象類來達到處理邏輯和具體實現分離的目的:
下面是兩個簡單的邏輯處理(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的派生類來實現這些記錄方式:
下面是一個生成事件記錄對象的工廠:
從我們舉的例子中可以看到,有2種業務處理邏輯,有4個具體實現,它們組成了8種事件記錄方式,另外,4個具體實現單獨使用的話又有4種記錄方式,實際上有12種事件記錄方式。
半天也沒能給這個設計模式想出一箇中文名稱,算了,有時候還是原版的更容易理解。
簡單地說,Archetype設計模式的目的是將業務處理邏輯和具體實現分離,所以至少需要兩個參與者:Decorator和Delegate,
它們都實現同一個接口,Decorator負責處理業務邏輯,而Delegate負責具體的實現,在Decorator的通用業務邏輯
處理過程中,會把具體實現委派給Delegate。
(注:這裏的Decorator並不是指”裝飾者“設計模式)
咱們還是用個例子講吧,假設系統中有一個記錄各種事件的接口:
public interface EventRecorder{
// 記錄事件的內容
public void record(String event);
}
// 記錄事件的內容
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{
}
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 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);
}
}
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種事件記錄方式。