我有一堂课
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
视为Subscriber
,而在后者中body
意识到header
是。那个抽象层是紧密耦合和松散耦合之间的区别。