我上课
class TableComponent {
tableBody
tableHeader
tableFooter
}
TableHeader
具有应根据tableBody
的状态启用或禁用的按钮
class TableHeader {
button
void enableButton(false|true)
}
要处理此问题,我将TableHeader
的实例传递给TableBody
,就像这样
new TableBody(tableHeader);
在tableBody
内,我执行一些操作并调用tableHeader.enableButton()
但是有没有办法不将tableHeader
的引用传递到正文中?例如使用EventBus
会更好吗?还是要将所有表类都加入一个类?
答案 0 :(得分:2)
您已经非常接近观察者模式。缺少的部分只是创建Pub / Sub接口,以便在将标头传递到主体时,具有适当的抽象层,可以防止具体的表组件直接相互耦合。
5002
尽管行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
,而在后者中Subscriber
知道body
是header
。那一层抽象是紧密耦合和松散耦合之间的区别。