从另一个组件更新组件的状态

时间:2019-01-17 09:13:28

标签: java design-patterns

我上课

class TableComponent {
    tableBody
    tableHeader
    tableFooter
}

TableHeader具有应根据tableBody的状态启用或禁用的按钮

class TableHeader {
    button

    void enableButton(false|true)
}

要处理此问题,我将TableHeader的实例传递给TableBody,就像这样

new TableBody(tableHeader);

tableBody内,我执行一些操作并调用tableHeader.enableButton()

但是有没有办法不将tableHeader的引用传递到正文中?例如使用EventBus会更好吗?还是要将所有表类都加入一个类?

1 个答案:

答案 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知道bodyheader。那一层抽象是紧密耦合和松散耦合之间的区别。