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è)置完成,任何類都不需要引用其他類。
聽起來你正在尋找這樣的東西。

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)該盡可能清晰和具體。

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
不是事件模型。

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;
}
}
添加回答
舉報(bào)