gpt4 book ai didi

java - 设计一个只监听某些属性的 PropertyChangeListener

转载 作者:行者123 更新时间:2023-11-30 09:10:43 25 4
gpt4 key购买 nike

我正在为以下与观察者模式相关的问题寻找设计模式/解决方案,我已经研究过了。

在我的代码中,我有一个 MyModel 类。它有很多属性。

public class MyModel {

private List<Flower> flowers = new ArrayList<Flower>();
private List<Toys> toys = new ArrayList<Toys>();
private List<Coffee> coffees = new ArrayList<Coffee>();

private List<IBusinessEntityListener> listener =
new ArrayList<IBusinessEntityListener>();

public void addChangeListener(IBusinessEntityListener newListener) {
listener.add(newListener);
}

}

因此实现IBusinessEntityListener 的类可以注册到MyModel 类。

然后我有 10 多个听众只对 MyModel一些 属性感兴趣。它们都实现了 IBusinessEntityListener。但是我如何指定(例如使用 Java 泛型?)一些听众只对 Flowers 感兴趣,而一些只对 Toys 感兴趣,等等?

那么如何设计支持监听特定属性的类结构呢?

无论如何,所有监听器都会为操作addupdatedelete 实现3 个方法。

最佳答案

申请Extrinsic Visitor怎么样?模式?

为属性定义一个接口(interface):

public interface ListenableProperty {
// Degenerate interface for listeners
public interface Listener {}

public void acceptUpdate(Listener listener);
}

然后为每个属性实现一个类,为每个属性实现一个Listener 接口(interface),并在您的模型中像这样使用:

public class MyModel {
public static class FlowersProperty implements ListenableProperty {
public interface Listener extends ListenableProperty.Listener {
public void update(FlowersProperty p);
}

@Override
public void acceptUpdate(ListenableProperty.Listener listener) {
if (listener instanceof FlowersProperty.Listener) {
Listener myListenerType = (Listener)listener;
myListenerType.update(this);
}
}

// some property accessors here
}

public static class ToysProperty implements ListenableProperty {
public interface Listener extends ListenableProperty.Listener {
public void update(ToysProperty p);
}

@Override
public void acceptUpdate(ListenableProperty.Listener listener) {
if (listener instanceof ToysProperty.Listener) {
Listener myListenerType = (Listener)listener;
myListenerType.update(this);
}
}

// some property accessors here
}

private FlowersProperty flowers = new FlowersProperty();
private ToysProperty toys = new ToysProperty();
private List<ListenableProperty> properties = new ArrayList();

// CopyOnWrite so that listeners can remove themselves during update if desired
private List<ListenableProperty.Listener> listeners =
new CopyOnWriteArrayList<>();

// Convenience interface for implementors that want all properties
public interface AllPropertiesListener extends
FlowersProperty.Listener,
ToysProperty.Listener
{}

public MyModel() {
properties.add(flowers);
properties.add(toys);
}

public void addListener(ListenableProperty.Listener l) {
if (!listeners.contains(l)) {
listeners.add(l);
}
}

private void updateAll() {
for (ListenableProperty p : properties) {
for (ListenableProperty.Listener l : listeners) {
p.acceptUpdate(l);
}
}
}

private void updateToys() {
for (ListenableProperty.Listener l : listeners) {
toys.acceptUpdate(l);
}
}

private void updateFlowers() {
for (ListenableProperty.Listener l : listeners) {
flowers.acceptUpdate(l);
}
}
}

然后,监听器可以根据需要实现任意数量的监听器接口(interface),或者通过便捷接口(interface)MyModel.AllPropertiesListener

实现所有的监听器接口(interface)

您还可以将个别属性的更新例程移至属性本身。

关于java - 设计一个只监听某些属性的 PropertyChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22422088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com