首页 > 解决方案 > 从另一个组件更新组件的状态

问题描述

我有一堂课

class TableComponent {
    tableBody
    tableHeader
    tableFooter
}

TableHeader有一个应该根据状态启用或禁用的按钮tableBody

class TableHeader {
    button

    void enableButton(false|true)
}

为了处理这个我通过实例TableHeaderTableBody喜欢这个

new TableBody(tableHeader);

在里面tableBody我做了一些动作并调用tableHeader.enableButton()

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

标签: javadesign-patterns

解决方案


您已经非常接近观察者模式了。缺少的部分只是创建 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看到headeraSubscriber而后者body知道那header是 a TableHeader。该抽象层是紧耦合和松耦合之间的区别。


推荐阅读