0

我有时在代码中使用这种模式,我想知道它是好是坏,甚至有一个名字。我做了一些研究,看看它是否是解决问题的常用模式,但似乎找不到任何东西。它帮助我做的是防止太多同事或对等对象使用内存知识。我想一个例子可以最好地描述它。

假设我有一个玩家有库存的游戏。库存中有物品,每个物品都有一个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),那么它还有一个公共方法可以解耦知识。

我的问题首先是,这种模式有名称,还是我没有看到的另一种模式的变量?其次,这是好做法还是坏做法?对我来说,这很好,但我可能会遗漏一些东西。

4

1 回答 1

3

在我看来,这是Flyweight 模式的一个相当教科书的例子。

享元是一种通过与其他类似对象共享尽可能多的数据来最小化内存使用的对象;当简单的重复表示将使用不可接受的内存量时,这是一种使用大量对象的方法。通常可以共享对象状态的某些部分,通常的做法是将它们保存在外部数据结构中,并在使用时将它们临时传递给享元对象。

于 2013-10-07T21:58:52.607 回答