文章

观察者模式

观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,它的所有依赖对象都会收到通知并自动更新。在游戏开发中,观察者模式常用于实现事件系统(例如玩家获得道具或者触发战斗事件)、UI界面等。

下面是一个简单的观察者模式的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public interface GameEventObserver {
    void onGameEvent(GameEvent event);
}

public class Player implements GameEventObserver {
    public void onGameEvent(GameEvent event) {
        if (event.getType() == GameEventType.ENEMY_KILLED) {
            // Player gains experience and loot
        }
    }
}

public class GameEventManager {
    private List<GameEventObserver> observers = new ArrayList<>();
    
    public void registerObserver(GameEventObserver observer) {
        observers.add(observer);
    }
    
    public void unregisterObserver(GameEventObserver observer) {
        observers.remove(observer);
    }
    
    public void notifyObservers(GameEvent event) {
        for (GameEventObserver observer : observers) {
            observer.onGameEvent(event);
        }
    }
}

在这个示例中,GameEventManager 是一个观察者模式的主题,它负责管理游戏事件的订阅和发布。Player 类实现了 GameEventObserver 接口,并注册到了 GameEventManager 中。当游戏事件发生时,GameEventManager 会通知所有的观察者,包括 Player,以便它们可以处理游戏事件。

再例如,在一个 RPG 游戏中,玩家可以通过点击怪物来攻击它,需要实现点击事件的观察者模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public interface IClickable {
    void OnClick();
}

public class Monster : IClickable {
    public void OnClick() {
        // 受到攻击逻辑
    }
}

public class Player {
    private List<IClickable> clickables = new List<IClickable>();

    public void AddClickable(IClickable clickable) {
        clickables.Add(clickable);
    }

    public void RemoveClickable(IClickable clickable) {
        clickables.Remove(clickable);
    }

    public void OnClick() {
        foreach (IClickable clickable in clickables) {
            clickable.OnClick();
        }
    }
}

// 调用代码
Monster monster = new Monster();
Player player = new Player();
player.AddClickable(monster);
player.OnClick();
本文由作者按照 CC BY 4.0 进行授权