最近,我來到了我特別喜歡的一個解決方案,我想知道,如果它有一個名字作爲設計圖案或是否可以被視爲匹配State pattern。此解決方案解決的問題如下(我將使用Java作爲語言的例子):熱交換裝飾?
我們有靴子,我們需要根據已經初始化什麼不同子系統的輸出電平的系統。
(!警告這只是一個例子,不工作的代碼)
比方說,我們有:ConsoleTextMsgs
,NetworkMsgs
和GUIMsgs
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模式。很多人可能會使用它,我想知道它是否有標籤。