我有课
class TableComponent {
tableBody
tableHeader
tableFooter
}
TableHeader
有一个按钮,应根据 tableBody
的状态启用或禁用
class TableHeader {
button
void enableButton(false|true)
}
为了处理这个问题,我将 TableHeader
的实例传递给 TableBody
,如下所示
new TableBody(tableHeader);
在tableBody
内部,我执行一些操作并调用tableHeader.enableButton()
但是有没有办法不将 tableHeader
的引用传递到正文中?使用 EventBus
的例子会更好吗?或者将所有表类合并为一个类?
最佳答案
您已经非常接近观察者模式了。缺少的部分只是创建 Pub/Sub 接口(interface),这样当您将 header 传递到主体中时,您就有了一个抽象层,可以防止具体的表组件直接相互耦合。
public class MainJava {
interface Publisher { void subscribe(Subscriber s); }
interface Subscriber { void update(); }
public static void main(String... args) {
TableComponent component = new TableComponent(new TableBody(), new TableHeader(), new TableFooter());
component.setBodyText("Hello World");
}
static class TableComponent {
final TableBody body;
final TableHeader header;
final TableFooter footer;
public TableComponent(TableBody body, TableHeader header, TableFooter footer) {
this.body = body;
this.header = header;
this.footer = footer;
body.subscribe(header);
}
public void setBodyText(String newBody) {
body.edit(newBody);
}
}
static class TableBody implements Publisher {
final Set<Subscriber> subscribers = ConcurrentHashMap.newKeySet();
@Override
public void subscribe(Subscriber s) {
subscribers.add(s);
}
void edit(String newBody) {
System.out.println(newBody);
subscribers.forEach(Subscriber::update);
}
}
static class TableHeader implements Subscriber {
@Override
public void update() {
System.out.println("Toggle Button");
}
}
static class TableFooter {}
}
尽管 body.subscribe(header);
行可能看起来与 new TableBody(tableHeader);
没有什么不同,但在前者中, body
至关重要code> 仅将 header
视为 订阅者
,而在后者中,body
知道 header
是一个 表头
。该抽象层就是紧耦合和松耦合之间的区别。
关于java - 从另一个组件更新组件的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54232467/