我和一个朋友讨论了如何用两个包实现观察者模式。
下面是一个虚构的例子:包"游戏"包含类"战场"。包"播放器"包含"IPlayer"(以及该接口的各种实现(。
现在我们要在战场上观察玩家。为此,我们创建了一个接口"IPlayerObserver"one_answers"IOberservablePlayer"。IPlayer继承IOberservablePlayer。
我们应该把"IPlayerObserver"放在哪个包中?
// Package: Players
public interface IPlayer extends IOberservablePlayer {}
// Package: Gaming
public class Battlefield implements IPlayerObserver {}
// Which package?
public interface IPlayerObserver {
void notify(IPlayer player);
}
public interface IOberservablePlayer {
void addObserver(IPlayerObserver observer);
}
感谢所有有优势的答案。
core
^ ^
| |
| player
| ^
| |
gaming
- 与玩家保持完全以
Player
为中心的项目 - 不要直言不讳。I所有的模式都可以追溯到匈牙利符号,现在根本不需要了。如果你的接口是代码要引用的主要内容,那么给它一个最干净的名称
- 您可能可以像我下面所做的那样对
Observable
接口进行通用化,并将其放入通用的"核心"包中
package com.yourname.player;
public interface Player extends Oberservable<PlayerObserver>
package com.yourname.gaming;
public class Battlefield implements PlayerObserver
package com.yourname.player;
public interface PlayerObserver {
void notify(Player player);
}
package com.yourname.core;
public interface Oberservable<T> {
void addObserver(T observer);
}
此外,不直接在其他重要类上实现这样的监听器稍微干净一些,因为当只有Player
要调用它时,它会向所有人公开像Battlefield.notify(Player)
这样的方法
尝试在Battlefield
:中执行此操作
player.addObserver(this::playerNotification)
...
private void playerNotification(Player p) {}
就像David pérez在评论中所说的那样:你的接口名称已经在告诉你了。将观察玩家所需的一切分组在一个包中是有意义的,这样另一个包只需要导入玩家包。