【发布时间】:2021-02-20 16:29:31
【问题描述】:
我正在通过以下方式实现观察者模式:
interface Layer{
void adjustString(Set<String> strings);
}
interface NotifiableLayer extends Layer{
void layerAdjusted(Layer layer);
}
abstract class ObservableLayer implements Layer{
Set<NotifiableLayer> observers = new HashSet<>();
void addObserver(NotifiableLayer layer){
observers.add(layer);
}
void removeObserver(NotifiableLayer layer){
observers.remove(layer);
}
void notifyObservers(){
observers.forEach(l -> l.layerAdjusted(this));
}
}
class MyLayer extends ObservableLayer{
@Override
public void adjustString(Set<String> strings) {
this.notifyObservers(); //can this be auto?
}
}
这当然可行,但是实现ObservableLayer 的人需要记住在adjustString 方法中调用this.notifyObservers()。这没什么大不了的,但我想看看有没有办法完全隐藏它。
到目前为止,我只有这个想法(使用模板方法):
abstract class ObservableLayer implements Layer{
//...methods removed for simplicity
@Override
public void adjustString(Set<String> strings) {
this.doAdjustString(strings);
this.notifyObservers(); //<---- here is auto
}
abstract void doAdjustString(Set<String> strings);
}
class MyLayer extends ObservableLayer{
@Override
public void doAdjustString(Set<String> strings) {
//now notification is in base adjustString
}
}
但是这里我不喜欢把那个方法名改成doAdjustString,而且其他层实现之间不再统一(直接实现Layer接口的层)。
有没有简单的方法来拥有这个功能,但要在MyLayer 类中保留public void adjustString(Set<String> strings) 签名?
【问题讨论】:
标签: java oop design-patterns observer-pattern template-method-pattern