第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

多個(gè)對(duì)象如何在沒有實(shí)例引用的情況下向?qū)ο蟀l(fā)送通知(在 java 中)?

多個(gè)對(duì)象如何在沒有實(shí)例引用的情況下向?qū)ο蟀l(fā)送通知(在 java 中)?

慕桂英546537 2023-05-10 13:20:46
我正在用 Java 開發(fā)視頻游戲,我想在所有敵人都死后進(jìn)入下一個(gè)級(jí)別。我有一個(gè) Enemy 類、一個(gè) Level 類和一個(gè) WorldGame 類。在 WorldGame 中,我移除了敵人,但我不知道如何在所有敵人都死了而必須進(jìn)入下一個(gè)級(jí)別時(shí)通知級(jí)別,而不將 Level 的實(shí)例傳遞給所有敵人。你有什么建議嗎?class Alien {}class GameWorld {  removeEnemy();}class Level {  goToNextLevel();}
查看完整描述

4 回答

?
神不在的星期二

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊

查看觀察者設(shè)計(jì)模式。Java 中的內(nèi)置版本已被刪除,但您可以輕松編寫自己的版本。(事件的)偵聽器仍然是 Java 模式的一個(gè)示例。

這個(gè)想法是,一個(gè) Java 對(duì)象,比如 A,可以被另一個(gè) Java 對(duì)象,比如 O“觀察”。事實(shí)上,可以有任意數(shù)量的“觀察者”。所有觀察者都是獨(dú)立的,彼此不了解,A 對(duì)觀察者一無所知。

現(xiàn)在,A 可以做的是在有理由這樣做時(shí)(通過調(diào)用方法)發(fā)出通知(A 可能是一個(gè)死去的怪物)。這導(dǎo)致在所有觀察者中調(diào)用一個(gè)特殊方法(更新),然后可以采取行動(dòng)(例如,減少仍然活著的怪物的數(shù)量)。

關(guān)鍵是一旦所有設(shè)置完成,任何類都不需要引用其他類。

聽起來你正在尋找這樣的東西。


查看完整回答
反對(duì) 回復(fù) 2023-05-10
?
翻翻過去那場雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊

我認(rèn)為你在混淆責(zé)任。關(guān)卡(或敵人)不知道其他敵人。我認(rèn)為你更需要這樣的東西:


 class GameWorld { 


    public void mainGameLoop() {

       ...

       removeEnemiesThatRequireRemoval();

       if (getNumberEnemiesLeft() == 0) {

         currentLevel = levelsManager.goToNextLevel(currentLevel);

意義:

  • 級(jí)別類不知道“下一個(gè)”級(jí)別(它只知道自己)

  • 如前所述:一個(gè)敵人不知道(所有剩余的)敵人

這就是您的中央“控制結(jié)構(gòu)”需要具備的所有知識(shí)。它不應(yīng)該去任何其他地方。

這應(yīng)該是你的中心主題:任何對(duì)象都應(yīng)該確切地知道它需要什么來完成它的核心工作,而不是更多。它的核心工作也應(yīng)該盡可能清晰和具體。


查看完整回答
反對(duì) 回復(fù) 2023-05-10
?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊

在您的示例中,您可以使用事件偵聽器機(jī)制。創(chuàng)建事件AllEnemiesDeadEvent和偵聽器接口AllEnemiesDeadListener。將偵聽器的注冊(cè)表保存在GameWorld. 讓 Gameworld 在它調(diào)用時(shí)跟蹤死去的敵人removeEnemy()。當(dāng)所有敵人都死了它會(huì)引發(fā)事件。

現(xiàn)在,讓 Level 類注冊(cè)AllEnemiesDeadListener并在該事件發(fā)生時(shí)得到通知。

如果Level是唯一對(duì)此事件感興趣的類,請(qǐng)保持簡單。只需調(diào)用Level#gotoNextLevel()GameWorld不是事件模型。


查看完整回答
反對(duì) 回復(fù) 2023-05-10
?
小怪獸愛吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊

假設(shè)您的應(yīng)用程序中的 GameWorld 類可以訪問所有關(guān)卡,而這些關(guān)卡又在該關(guān)卡上有敵人。您可以參考以下代碼庫并提出最適合您需求的解決方案。


public class GameWorld {


    private List<GameLevel> gameLevels;

    private GameLevel currentLevel;


    public GameWorld() {

        gameLevels = new LinkedList<GameLevel>();

        this.instantiate();

    }


    private void instantiate() {

        // instantiate game adding levels to it

    }


    public void moveToNextLevel() {

        currentLevel = currentLevel.next();

    }


}


public class Enemy {


    private EnemyType enemyType;

    private GameLevel gameLevel;


    public Enemy(GameLevel level, EnemyType type) {

        enemyType = type;

        gameLevel = level; 

    }


    private void create() {

        // .. instantiation task

        gameLevel.listEnemy(this);

    }


    private void killEnemy() {

        // clean up task

        gameLevel.delistEnemy(this);

        // .. clean up task

    }


}


public class GameLevel {


    private GameWorld gameWorld;

    private List<Enemy> enemies;

    private GameLevel nextLevel;


    public GameLevel(GameWorld world) {

        enemies = new ArrayList<Enemy>();

        gameWorld = world;

    }


    public void listEnemy(Enemy enemy) {

        enemies.add(enemy);

    }


    public void delistEnemy(Enemy enemy) {

        enemies.remove(enemy);

        if(enemies.isEmpty()) {

            gameWorld.moveToNextLevel();

        }

    }


    public void setNextLevel() {

        // set next level after this

    }


    public GameLevel next() {

        return nextLevel;

    }


}



查看完整回答
反對(duì) 回復(fù) 2023-05-10
  • 4 回答
  • 0 關(guān)注
  • 184 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)