обновить состояние компонента из другого компонента - PullRequest
0 голосов
/ 17 января 2019

У меня есть класс

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 голосов
/ 17 января 2019

Вы уже очень близки к Наблюдателю. Недостающим элементом является просто создание интерфейсов 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 TableHeader. Этот уровень абстракции - это разница между жесткой связью и слабой связью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...