Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么面向对象的GUI设计能够正确地结合命令和观察者模式?_Java_Design Patterns_Command Pattern_Observer Pattern - Fatal编程技术网

Java 什么面向对象的GUI设计能够正确地结合命令和观察者模式?

Java 什么面向对象的GUI设计能够正确地结合命令和观察者模式?,java,design-patterns,command-pattern,observer-pattern,Java,Design Patterns,Command Pattern,Observer Pattern,是否有一个面向对象的GUI设计,它是命令和观察者模式的合理组合 我的Java GUI尝试将命令和观察者模式结合起来,如下所示: 客户端是命令接收器的观察者(例如,输入GUI屏幕或对话框) 调用程序是客户端的一个实例变量 客户端的update()方法接收命令接收器的输入,并使用适当的命令更新调用程序 让我对这个实现感到不舒服的是update()方法包含大量的条件if语句 e、 g 使用命令模式有效地处理GUI事件的正确方法目前还没有找到。观察者模式对它有用吗?嗯,UI的总体设计解决方案是MVC

是否有一个面向对象的GUI设计,它是命令和观察者模式的合理组合

我的Java GUI尝试将命令和观察者模式结合起来,如下所示:

  • 客户端是命令接收器的观察者(例如,输入GUI屏幕或对话框)
  • 调用程序是客户端的一个实例变量
  • 客户端的update()方法接收命令接收器的输入,并使用适当的命令更新调用程序
让我对这个实现感到不舒服的是update()方法包含大量的条件if语句

e、 g


使用命令模式有效地处理GUI事件的正确方法目前还没有找到。观察者模式对它有用吗?

嗯,UI的总体设计解决方案是MVC,或者它的一些变体(实际上,人们通常不使用显式控制器,而是使用基本上与控制器耦合的模型和视图)。除非您想建立一个撤销框架,否则命令在那里不是必不可少的


在任何情况下,如果您使用Java,您很可能会被一个UI库(如Swing或SWT)所困扰,而这个库将对您的设计产生很大影响。

我最终无法得到您想要的。模式必须解决问题,而不是为了使用而使用。那么你要解决的问题是什么?@Andrey:我要解决的问题是建立一个高效的面向对象GUI设计,它可以扩展到我计划的多个应用程序。我为你的困惑道歉。如果问题是主观的或冒犯性的,请随时指定删除。谢谢!我以前用过MVC。既然你推荐了,我就再公平地考虑一下。命令模式看起来非常适合我的应用程序,因为有了undo和宏,但我想现在用Observer模式高效地实现它已经超出了我的能力。
public class Client implements Observer {
    InputScreen inputScreen;
    Invoker director;
    InputScreenCommand inputScreenCommand;

    public Client {
        inputScreen = new InputScreen();
        inputScreen.registerObserver(this);            
        inputScreenCommand = new InputScreenCommand(inputScreen)
        director.setCommand(inputScreenCommand);
        director.invoke();
    }

    public void update(String command) {
        if (command.equals("Input Screen 2")) {
            inputScreen.removeObserver(this);
            // generate new receiver/subject
            inputScreen2.registerObserver(this);
            // generate new Command
            director.setCommand(inputScreen2Command);
            director.invoke();
        }
        // and so on through all the permutations of input from receivers
    }
}