java - 从另一个组件更新组件的状态
问题描述
我有一堂课
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 接口,这样当您将标头传递到正文时,您就有了一个抽象层,可以防止具体的表格组件直接相互耦合。
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
看到header
aSubscriber
而后者body
知道那header
是 a TableHeader
。该抽象层是紧耦合和松耦合之间的区别。
推荐阅读
- java - AnysoftKeyboard (Android) 的构建问题
- bash - LDAP 转储的 Bash 脚本数据解析
- python - 用 Scrapy 和 Selenium 抓取 CNN
- pine-script - 每次出现新栏时标签都会重复
- php - 无法在本地 Apache 服务器中打开 PHP webapp。获取错误 404
- python - Keras 创建新的损失函数
- python - 在 Windows Server 2016 上安装 OCRmyPDF - 找不到 liblept.dll。编辑路径安全吗?
- r - R函数相当于SAS中的proc摘要
- gradle - 运行进程时如何在 WSL 中禁用“自动滚动到终端窗口底部”?
- angular - 角度路由:如何对传递给 RouterModule.forRoot 的数组应用自定义