如何用两个包实现观察者模式

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

这是一个虚构的示例: 包“游戏”包含类“战场”。 包“播放器”包含“ IPlayer”(以及此接口的各种实现)。

现在,我们希望战场能够观察玩家。因此,我们创建一个接口“ IPlayerObserver”和“ 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);
}

非常感谢您提供所有答案。

Asongze123456789 回答:如何用两个包实现观察者模式

    core
    ^  ^
    |  |
    | player
    |    ^
    |    |
    gaming
  • 与玩家保持Player集中的物品
  • 不要将锹称为锹。 IE的所有模式都可以追溯到Hungarian notation,而如今根本不需要。如果您的界面是主要的东西代码,则将引用它,然后为其提供最干净的名称。
  • 您可能可以像下面所做的那样通用化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);
}

此外,如果不打算在其他重要类上直接实现此类侦听器,则可能会更干净一些,因为当只有Battlefield.notify(Player)被调用时,它将Player这样的方法公开给所有人。

尝试在Battlefield内执行此操作:

player.addObserver(this::playerNotification)
...
private void playerNotification(Player p) {}
,

就像DavidPérez在他的评论中所述:您的界面名称已经在告诉您。 合理地将观察玩家所需的所有内容归为一个包,这样另一个包只需要导入玩家包即可。

本文链接:https://www.f2er.com/3110370.html

大家都在问