我有一堂课

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是。那个抽象层是紧密耦合和松散耦合之间的区别。

09-05 00:19