我最近找到了一个我特别喜欢的解决方案,我想知道它是否有一个名称作为设计模式,或者是否可以认为它与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将是最后准备好的。
所以我有一个启动过程,由启动'系统'的方法类:
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模式。许多人可能正在使用它,我想知道它是否有标签。
答案 0 :(得分:3)
这当然可行,而且它显然使用了Decorator模式。它在某种程度上类似于State,但是以一种非常简单的方式并没有真正使用该模式的某些功能。
我不知道这个名字。
我个人更倾向于在这里使用复合材料,并在不装饰的情况下实施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);
}
}
那么你就不必实际&#34;热插拔&#34;任何事情,所有代表团都在一个地方处理。只需在启动开始时将空复合材料放置到适当的位置,然后将子系统添加到复合材料中。