在某 FPS 游戏中提供了一个游戏管理器(Game Manager),通过该管理器用户 可以对音效(Sound Effect)、场景(Scene)、游戏角色(Role)等对象进行参数设置。为了节约系 统资源并且保证对象状态的一致性,在游戏运行时,用户只能打开唯一的一个管理器界面。 根据以上描述,请选择两种合适的设计模式设计该游戏管理器,在实现对多个对象进行 统一设置的同时保证游戏管理器的唯一性。 请给出这两种设计模式的名称和定义,并结合实例绘制对应的结构图(类图,类名、方法名和属性名可自行定义)。请提交Java代码以及选择原因注释。
时间: 2024-03-18 20:44:32 浏览: 199
两种设计模式分别是单例模式和观察者模式。
1. 单例模式
单例模式是一种创建型设计模式,它保证一个类仅有一个实例,并提供一个访问它的全局访问点。
在游戏管理器中,只有一个管理器实例是必要的,因为用户只能打开唯一的一个管理器界面。单例模式可以保证只有一个管理器实例。
以下是单例模式的类图:
![singleton](https://github.com/chit-chu/design-patterns/blob/master/singleton.png)
代码实现:
```java
public class GameManager {
private static GameManager instance = null;
private GameManager() {}
public static GameManager getInstance() {
if (instance == null) {
instance = new GameManager();
}
return instance;
}
public void setSoundEffectVolume(int volume) {
// 设置音效音量
}
public void setSceneLighting(int lighting) {
// 设置场景光照
}
public void setRoleSpeed(int speed) {
// 设置角色速度
}
}
```
选择原因:
单例模式可以保证在运行时只有一个游戏管理器实例,从而保证了对象状态的一致性。同时,单例模式也能节约系统资源,因为只有一个对象需要被创建和维护,而不是多个对象。
2. 观察者模式
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,它的所有观察者都会收到通知并更新自己。
在游戏管理器中,用户需要对多个对象进行统一设置,例如设置音效、场景、角色等。观察者模式可以让这些对象都成为游戏管理器的观察者,当用户设置游戏管理器的某个属性时,所有观察者都会收到通知并更新自己的状态。
以下是观察者模式的类图:
![observer](https://github.com/chit-chu/design-patterns/blob/master/observer.png)
代码实现:
```java
import java.util.ArrayList;
import java.util.List;
public class GameManager {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this);
}
}
public void setSoundEffectVolume(int volume) {
// 设置音效音量
notifyObservers();
}
public void setSceneLighting(int lighting) {
// 设置场景光照
notifyObservers();
}
public void setRoleSpeed(int speed) {
// 设置角色速度
notifyObservers();
}
}
interface Observer {
void update(GameManager gameManager);
}
class SoundEffect implements Observer {
@Override
public void update(GameManager gameManager) {
// 更新音效
}
}
class Scene implements Observer {
@Override
public void update(GameManager gameManager) {
// 更新场景
}
}
class Role implements Observer {
@Override
public void update(GameManager gameManager) {
// 更新角色
}
}
```
选择原因:
观察者模式可以让游戏管理器与其他对象解耦,从而使得代码更加模块化和可维护。同时,它也可以让用户对多个对象进行统一设置,保证了对象状态的一致性。
阅读全文