2014-04-17 40 views
2

最近,我來到了我特別喜歡的一個解決方案,我想知道,如果它有一個名字作爲設計圖案或是否可以被視爲匹配State pattern。此解決方案解決的問題如下(我將使用Java作爲語言的例子):熱交換裝飾?

我們有靴子,我們需要根據已經初始化什麼不同子系統的輸出電平的系統。

(!警告這只是一個例子,不工作的代碼)

比方說,我們有:ConsoleTextMsgsNetworkMsgsGUIMsgs I /表示爲同名類O子系統。我們還有一個名爲'System'的類來實現啓動系統。

interface IOSubsystem { 
    void showMessage(String msg); 
} 

class ConsoleTextMsgs implements IOSubsystem 
{ 
    public ConsoleTextMsgs() { ... }; 

    void showMessage(String msg) { 
     impPrint((new Date()).toString() + "\t:\t" + msg); 
    } 

    private impPrint(String msg) { ... }; 

} 

//`ConsoleTextMsgs`, `NetworkMsgs` and `GUIMsgs` 
class NetworkMsgs implements IOSubsystem 
{ 
    public NetworkMsgs(IOSubsystem decorated, NetworkService serv) 
    { 
     this.decorated = decorated; 
     ... 
     ... 
    } 

    void showMessage(String msg) { 
     send2net((new Date()).toString() + "\t:\t" + msg); //New functionality which uses the NetworkService 
     decorated.showMessage(msg); //I want the message to by shown at the console too. 
    } 

    private send2net(String msg) { ... }; 

    IOSubsystem decorated; 
} 

//`ConsoleTextMsgs`, `NetworkMsgs` and `GUIMsgs` 
class GUIMsgs implements IOSubsystem 
{ 
    public GUIMsgs(IOSubsystem decorated, GUIService serv) 
    { 
     this.decorated = decorated; 
     ... 
     ... 
    } 

    void showMessage(String msg) { 
     showOnGUI((new Date()).toString() + "\t:\t" + msg); //New functionality which uses the GUIService 
     decorated.showMessage(msg); //I want the message to by shown at the console too. 
    } 

    private showOnGUI(String msg) { ... }; 

    IOSubsystem decorated; 
} 

NetworkMsgs不能使用,直到NetworkService可用並啓動以及GUIMsgs不能使用,直到GUIService已準備就緒。

正如您所看到的,它是一個增量輸出系統,因爲每當我通過網絡發送消息時,我都想在控制檯上顯示它,並且每當顯示GUI消息時,我都希望它被髮送到網絡並顯示在控制檯。

然而,這些系統都不可在同一時間:控制檯將可以從一開始,而網絡服務將需要更長的時間來準備和GUIService會做好準備的最後一次。

所以我在「系統」類由「引導」的方法給予了啓動過程:

class System 
{ 
    public System() 
    { 
    ... 
     output = new ConsoleTextMsgs(); 
    ... 
    } 

    void boot() 
    { 
     output.showMessage("Starting system"); 
     ... 
     output.showMessage("Doing some stuff"); 
     ... 
     output.showMessage("Starting network service"); 
     NetworkService nsrv = bootNetwork(); 

     output = new NetworkMsgs(output, nsrv); // I call it hot swap decoration, how do you call it? 

     ... 
     ... 
     ... 

     GUIService gsrv = bootGUI(); 

     output = new GUIMsgs(output,gsrv); // Here we are again, does this even have a name? 

    }  
    private IOSubsystem output; 
} 

我認爲它可以被看作是國家+ Decorator模式。很多人可能會使用它,我想知道它是否有標籤。

回答

3

這當然可以工作,它顯然使用Decorator模式。它有點類似於國家,但以一種非常簡單的方式,並沒有真正使用模式的某些功能。

我不知道這個名字的。

我個人更傾向於在這裏使用複合材料,並實現IOSubsystem的其他各種版本,沒有裝飾。

如果你喜歡的東西定義複合:

public class CompositeIOSubsystem implements IOSubsystem { 

    List<IOSubsystem> subsystems = new ArrayList<IOSubsystem>(); 

    public void showMessage(String msg) { 
     for (IOSubsystem subsystem: subsystems) 
      subsystem.showMessage(msg); 
    } 

    public void add(IOSubsystem subsystem) { 
     subsystems.add(subsystem); 
    } 
} 

,那麼你不必實際上是「熱插拔」任何東西,所有的代表團在一個地方處理。只需在引導啓動時放置一個空的組合件,並在組合件可用時將子系統添加到組合件中。