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

标签 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 的例子会更好吗?或者将所有表类合并为一个类?

最佳答案

您已经非常接近观察者模式了。缺少的部分只是创建 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/

相关文章:

java - Java非法启动类型)预期

java - Tomcat webapp部署问题

java - 如何针对不同环境运行 JUnit 5 测试套件 [micronaut 1.2.5]?

node.js - 所有连接在应用程序提供服务之前连接

c++ - 包装器和库之间的区别

java - JScience 货币单位换算是否颠倒?

Java Swing 线程安全和 EDT

java - 拆分服务 -> 业务对象?

c# - 哪一层做类似: caching and logging belong?的功能

Javascript 模块模式帮助