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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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 无需参考业务逻辑即可更新单个用户界面组件的模式_Java_Design Patterns_User Interface_Model View Controller_Observer Pattern - Fatal编程技术网

Java 无需参考业务逻辑即可更新单个用户界面组件的模式

Java 无需参考业务逻辑即可更新单个用户界面组件的模式,java,design-patterns,user-interface,model-view-controller,observer-pattern,Java,Design Patterns,User Interface,Model View Controller,Observer Pattern,用业务逻辑内容更新单个用户界面组件的好设计是什么 我有一个窗口UIWindow,其中包含不同种类的UIComponents。 我有一个网络流量读取器NetworkDemon,它可以读取我电脑的网络流量。 我想在用户界面中显示读取的流量 NetworkDemon应独立于显示其数据的UIComponent。 目前,我正在UIWindow和NetworkDemon之间使用观察者模式,但我不知道如何以某种方式设计我的代码,以便在不向UIWindow提供对NetworkDemon的引用的情况下,只有单个U

用业务逻辑内容更新单个用户界面组件的好设计是什么

我有一个窗口UIWindow,其中包含不同种类的UIComponents。 我有一个网络流量读取器NetworkDemon,它可以读取我电脑的网络流量。 我想在用户界面中显示读取的流量 NetworkDemon应独立于显示其数据的UIComponent。 目前,我正在UIWindow和NetworkDemon之间使用观察者模式,但我不知道如何以某种方式设计我的代码,以便在不向UIWindow提供对NetworkDemon的引用的情况下,只有单个UIComponents可以用作可观察NetworkDemon的观察者

我将以下类编码为简单示例,只需在控制台上打印数据:

import java.util.Observable;
import java.util.Observer;

public class UIWindow implements Observer {
    private UIComponent textArea;
    private UIComponent textList;

    public UIWindow() {
        textArea = new UITextArea();
        textList = new UITextList();
    }


    @Override
    public void update(Observable observable, Object data) {
        if(data instanceof String) {
            textArea.showData((String)data);                
        }
    }

}


abstract class UIComponent {

    public abstract void showData(String data);

}

class UITextArea extends UIComponent {

    @Override
    public void showData(String data) {
        System.out.println("UITextArea: " + data);
    }

}

class UITextList extends UIComponent {

    @Override
    public void showData(String data) {
        System.out.println("UITextList: " + data);      
    }

}

class NetworkDemon extends Observable {

    public void readNetworkTraffic() {
        // this sample data is readed from the network
        String data = "sampleData";
        setChanged();
        notifyObservers(data);      
    }

}

class Main {

    public static void main(String[] args) {
        UIWindow window = new UIWindow();
        NetworkDemon demon = new NetworkDemon();

        demon.addObserver(window);
        demon.readNetworkTraffic();     
    }
}
因此,我的问题是,如何将UIComponents注册到NetworkDemon作为观察者,而不在UIWindow和NetworkDemon之间引入依赖关系


类似于UIWindow=newuiWindowNetworkDemon;然后将组件注册到demon是不好的,因为我在窗口UI和demon模型之间有一个硬依赖关系。

没有简单的方法可以完全解耦它们。您通常要做的是引入第三个组件,即控制器,它将视图与模型分离,并标准化两者之间的接口。这样,您可以在不影响UI代码的情况下更改模型,也可以在不影响模型的情况下更改UI代码。看见控制器和模型之间存在硬依赖关系,视图和控制器之间存在硬依赖关系,但视图和模型之间不存在硬依赖关系。通过使模型实现接口并使控制器仅在接口上交互,可以进一步降低控制器和模型之间依赖关系的“硬度”。