Java 无需参考业务逻辑即可更新单个用户界面组件的模式
用业务逻辑内容更新单个用户界面组件的好设计是什么 我有一个窗口UIWindow,其中包含不同种类的UIComponents。 我有一个网络流量读取器NetworkDemon,它可以读取我电脑的网络流量。 我想在用户界面中显示读取的流量 NetworkDemon应独立于显示其数据的UIComponent。 目前,我正在UIWindow和NetworkDemon之间使用观察者模式,但我不知道如何以某种方式设计我的代码,以便在不向UIWindow提供对NetworkDemon的引用的情况下,只有单个UIComponents可以用作可观察NetworkDemon的观察者 我将以下类编码为简单示例,只需在控制台上打印数据: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
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代码。看见控制器和模型之间存在硬依赖关系,视图和控制器之间存在硬依赖关系,但视图和模型之间不存在硬依赖关系。通过使模型实现接口并使控制器仅在接口上交互,可以进一步降低控制器和模型之间依赖关系的“硬度”。