面试题答案
一键面试1. 抽象工厂模式
- 作用:用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。在游戏开发中,比如创建不同职业(战士、法师、刺客等)的角色及其初始装备,每个职业的角色和装备有不同的组合,抽象工厂模式可根据不同的职业类型创建对应的角色和装备对象,将对象创建和使用分离,提高代码的可维护性和可扩展性。
- 抽象类的角色:定义创建角色和装备对象的抽象接口,具体的工厂类继承该抽象类并实现创建对象的具体方法。例如,
class CharacterEquipmentFactory { public: virtual Character* createCharacter() = 0; virtual Equipment* createEquipment() = 0; };
具体的工厂类如WarriorFactory : public CharacterEquipmentFactory
实现createCharacter
和createEquipment
方法来创建战士及其装备。 - 交互逻辑:游戏初始化阶段,根据玩家选择的职业类型,使用对应的具体工厂对象来创建角色和装备。如
CharacterEquipmentFactory* factory = new WarriorFactory(); Character* warrior = factory->createCharacter(); Equipment* warriorEquipment = factory->createEquipment();
2. 观察者模式
- 作用:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在游戏中,例如技能释放可能会影响角色状态(如生命值、魔法值等),同时相关的UI界面(如血条、蓝条显示)也需要更新。观察者模式能让这些相关对象(UI界面)监听角色状态变化,当状态改变时及时更新。
- 抽象类的角色:定义观察者的抽象接口,包含更新方法。例如,
class Observer { public: virtual void update() = 0; };
具体的观察者类(如HealthBarUI : public Observer
)继承该抽象类并实现update
方法,在方法中实现血条UI更新逻辑。 - 交互逻辑:角色类作为被观察对象,维护一个观察者列表。当角色状态改变时,遍历观察者列表并调用每个观察者的
update
方法。如class Character { private: std::list<Observer*> observers; public: void addObserver(Observer* observer) { observers.push_back(observer); } void removeObserver(Observer* observer) { observers.remove(observer); } void notifyObservers() { for (Observer* observer : observers) { observer->update(); } } };
当角色生命值改变时调用notifyObservers
方法通知UI更新。
3. 状态模式
- 作用:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。在游戏中,角色可能有不同的状态(如正常、中毒、隐身等),不同状态下角色的行为(如移动速度、攻击力等)不同。状态模式可将这些不同状态的行为封装在不同的状态类中,使代码更清晰,易于维护和扩展。
- 抽象类的角色:定义状态的抽象接口,包含状态相关的行为方法。例如,
class CharacterState { public: virtual void move() = 0; virtual void attack() = 0; };
具体的状态类(如PoisonedState : public CharacterState
)继承该抽象类并实现move
和attack
方法,实现中毒状态下角色的移动和攻击行为。 - 交互逻辑:角色类持有一个状态对象指针,根据角色当前情况切换状态对象。如
class Character { private: CharacterState* currentState; public: void setState(CharacterState* state) { currentState = state; } void move() { currentState->move(); } void attack() { currentState->attack(); } };
当角色中毒时,Character* character = new Character(); CharacterState* poisonedState = new PoisonedState(); character->setState(poisonedState); character->move();
调用中毒状态下的移动行为。
系统整体交互逻辑
- 游戏启动时,通过抽象工厂模式创建角色和装备对象,初始化角色系统和装备系统。
- 角色在游戏过程中,其状态改变(如使用技能、受到攻击等)会触发观察者模式,通知相关UI更新,同时也可能根据条件切换状态,由状态模式控制角色在不同状态下的行为。
- 技能系统通过调用角色和装备的相关方法,实现技能效果,技能释放可能影响角色状态,进而触发观察者和状态模式的相关操作。各子系统通过这些设计模式紧密协作,构建一个灵活、可扩展且易于维护的系统架构。