我有时在代码中使用这种模式,我想知道它是好是坏,甚至有一个名字。我做了一些研究,看看它是否是解决问题的常用模式,但似乎找不到任何东西。它帮助我做的是防止太多同事或对等对象使用内存知识。我想一个例子可以最好地描述它。
假设我有一个玩家有库存的游戏。库存中有物品,每个物品都有一个databaseId,因此同一物品的两个副本可以简单地指向同一个数据库条目。当某物需要从玩家的物品栏中取出一件物品时,他们并不知道该物品本身的明确知识,而是只知道他们需要移除哪个物品 DB id。此外,项目由它们的handleId(唯一)存储,用于客户端用户界面(唯一的句柄被传递给接口,因此UIItem基本上具有某种回调id)
伪代码:
class Inventory
Map<int, Item> m_Items;
public:
bool RemoveItem(int dbItemId, int count)
{
Item* pItem = GetItemByDBId(dbItemId);
if (pItem) { return RemoveItem( pItem, count); }
return false
}
bool RemoveItem(int handle, count)
{
Item* pItem = m_Items.Find(handle); //Find in my Map returns a const pointer.
if (pItem) { return RemoveItem( pItem, count); }
return false;
}
private:
bool RemoveItem(Item* item, int count); //Handles logic of removing, removes, and returns true if the remove succeeds (ie, quest items can't be removed, etc)
Item* GetItemByHandle(int handle); //returns the item in the map by handle, null if not found
Item* GetItemByDBId(int dbId); //returns the first item with this dbId, null if not found.
现在,如果 UI 想要移除一个项目(即,玩家将其拖入垃圾箱),那么有一个公共方法可以解耦知识。如果一个 NPC 想要移除一个物品(假设 NPC 在接触玩家时偷窃,并且正在寻找一个特定的 ItemId),那么它还有一个公共方法可以解耦知识。
我的问题首先是,这种模式有名称,还是我没有看到的另一种模式的变量?其次,这是好做法还是坏做法?对我来说,这很好,但我可能会遗漏一些东西。