通过引用在对象之间进行通

时间:2017-05-29 08:12:52

标签: java oop reference

在Java编写简单的老式Snake时,我终于找到了OOP中最大的困境。这对你来说肯定是微不足道的,但我很长时间都不能把这个问题用在文字上。

我的问题是关于对象之间的引用。在沟通对象时,什么是约定和良好做法?我的意思是,当然不是每个对象都应该知道它的创建者,例如,在我的情况下,我觉得没有其他方法可以相互沟通。例如:

我有MainMenu类,通过“新游戏”按钮控制简单表单。单击该按钮时,会创建一个Game对象(具有自己的表单),并且当新的Game对象的表单设置为visible时,MainMenu表单将设置为不可见。当游戏结束时,我想关闭游戏的形式并重新出现MainMenu形式。但是重新出现在Game对象中,所以必须有一个对这个MainMenu对象的引用,所以我将它传递给构造函数,但对我来说感觉不对,因为Game对象不应该知道MainMenu,它们是分开的东西,唯一的兴趣与MainMenu相关的游戏对象是让它在游戏结束后再次出现,并且感觉不足以进行额外的引用。

应该怎么做?我认为重新出现应该发生在MainMenu课程中,但我如何跟踪游戏结束呢?如何在专业编程中解决这类问题?

(抱歉我的英文)

1 个答案:

答案 0 :(得分:0)

您可以创建GameFinishHandler之类的界面,让MainMenu实现它。 Game类在游戏结束时调用所有已注册的处理程序。

interface GameFinishHandler {
    void doAfterGameFinished();
}

class MainMenu implements GameFinishHandler {
    ...

    private void createGame() {
        this.game = new Game();
        this.game.addHandler(this);
        // ...
    }

    @Override
    public void doAfterGameFinished() {
        game.setVisible(false);
        this.setVisible(true);
    }

class Game {
    private final List<GameFinishHandler> finishHandler = new ArrayList<>();

    public void addHandler(GameFinishHandler handler) {
        finishHandler.add(handler);
    }

    private void afterGameFinished() {
        finishHandler.forEach(GameFinishHandler::doAfterGameFinished);
    }

因此,您的Game课程会提供您的菜单参考,但它并不“知道”它。它只包含任意数量的终结处理程序。