在某 FPS 游戏中提供了一个游戏管理器(Game Manager),通过该管理器用户 可以对音效(Sound Effect)、场景(Scene)、游戏角色(Role)等对象进行参数设置。为了节约系 统资源并且保证对象状态的一致性,在游戏运行时,用户只能打开唯一的一个管理器界面。 根据以上描述,请选择两种合适的设计模式设计该游戏管理器,在实现对多个对象进行 统一设置的同时保证游戏管理器的唯一性。 请给出这两种设计模式的名称和定义,并结合实例绘制对应的结构图(类图,类名、方法名和属性名可自行定义)。请提交代码以及选择原因注释。
时间: 2024-03-18 13:44:33 浏览: 73
FPS-Game
两种设计模式分别是单例模式和观察者模式。
1. 单例模式
单例模式是一种创建型设计模式,它保证一个类仅有一个实例,并提供一个访问它的全局访问点。
在游戏管理器中,只有一个管理器实例是必要的,因为用户只能打开唯一的一个管理器界面。单例模式可以保证只有一个管理器实例。
以下是单例模式的类图:
![singleton](https://github.com/chit-chu/design-patterns/blob/master/singleton.png)
代码实现:
```python
class GameManager:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def set_sound_effect_volume(self, volume):
pass
def set_scene_lighting(self, lighting):
pass
def set_role_speed(self, speed):
pass
```
选择原因:
单例模式可以保证在运行时只有一个游戏管理器实例,从而保证了对象状态的一致性。同时,单例模式也能节约系统资源,因为只有一个对象需要被创建和维护,而不是多个对象。
2. 观察者模式
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,它的所有观察者都会收到通知并更新自己。
在游戏管理器中,用户需要对多个对象进行统一设置,例如设置音效、场景、角色等。观察者模式可以让这些对象都成为游戏管理器的观察者,当用户设置游戏管理器的某个属性时,所有观察者都会收到通知并更新自己的状态。
以下是观察者模式的类图:
![observer](https://github.com/chit-chu/design-patterns/blob/master/observer.png)
代码实现:
```python
class GameManager:
def __init__(self):
self._observers = []
def attach(self, observer):
self._observers.append(observer)
def detach(self, observer):
self._observers.remove(observer)
def notify(self):
for observer in self._observers:
observer.update(self)
def set_sound_effect_volume(self, volume):
self.notify()
def set_scene_lighting(self, lighting):
self.notify()
def set_role_speed(self, speed):
self.notify()
class SoundEffect:
def update(self, game_manager):
pass
class Scene:
def update(self, game_manager):
pass
class Role:
def update(self, game_manager):
pass
```
选择原因:
观察者模式可以让游戏管理器与其他对象解耦,从而使得代码更加模块化和可维护。同时,它也可以让用户对多个对象进行统一设置,保证了对象状态的一致性。
阅读全文