如何用两个包实现Observer模式



我和一个朋友讨论了如何用两个包实现观察者模式。

下面是一个虚构的例子:包"游戏"包含类"战场"。包"播放器"包含"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在评论中所说的那样:你的接口名称已经在告诉你了。将观察玩家所需的一切分组在一个包中是有意义的,这样另一个包只需要导入玩家包。

最新更新