热插拔装饰?

时间:2014-04-17 08:29:02

标签: java design-patterns decorator state

我最近找到了一个我特别喜欢的解决方案,我想知道它是否有一个名称作为设计模式,或者是否可以认为它与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消息时,我希望它被发送到网络并显示在控制台。

但是,这些系统不能同时使用:控制台将从一开始就可用,而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模式。许多人可能正在使用它,我想知道它是否有标签。

1 个答案:

答案 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;任何事情,所有代表团都在一个地方处理。只需在启动开始时将空复合材料放置到适当的位置,然后将子系统添加到复合材料中。