【发布时间】:2014-04-17 08:29:01
【问题描述】:
我最近找到了一个我特别喜欢的解决方案,我想知道它是否有一个设计模式的名称,或者它是否可以被视为与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 消息时,我希望它被发送到网络并显示在控制台。
但是,这些系统不能同时使用:控制台从一开始就可用,而 NetworkService 需要更长的时间才能准备好,而 GUIService 将是最后准备好的。
所以我有一个由'System'类的'boot'方法给出的引导过程:
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;
}
我觉得可以看成是State+Decorator模式。可能很多人都在用,我想知道它有没有标签。
【问题讨论】:
标签: java design-patterns decorator state-pattern