【问题标题】:Hot swap decoration?热插拔装修?
【发布时间】:2014-04-17 08:29:01
【问题描述】:

我最近找到了一个我特别喜欢的解决方案,我想知道它是否有一个设计模式的名称,或者它是否可以被视为与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;
}

NetworkMsgsNetworkService 可用并已启动之前无法使用,GUIMsgsGUIService 准备就绪之前无法使用。

如您所见,它是一个增量输出系统,因为每当我通过网络发出消息时,我都希望在控制台上显示它,而每当显示 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


    【解决方案1】:

    这当然可以,而且它显然使用了装饰器模式。它在某种程度上类似于 State,但方式非常简单,并没有真正使用该模式的某些特性。

    我不知道这个名字。

    我个人更倾向于在这里使用 Composite,并在没有装饰的情况下实现 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);
        }
    }
    

    那么您就不必实际“热交换”任何东西,所有委托都在一个地方处理。只需在启动开始时放置一个空的组合,并在子系统可用时将它们添加到组合中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多