Адаптер публичных функций в с ++ - хорошо? Плохо? даже реальная картина?

0

Я иногда использую этот шаблон в коде, и мне интересно, хорошо ли оно, плохо или даже имеет имя. Я провел некоторое исследование, чтобы узнать, является ли он часто используемым шаблоном для решения проблем, но не может ничего найти. То, что мне помогает, - это предотвращение доступа к памяти из-за слишком большого количества коллег или одноранговых объектов. Я думаю, что пример лучше всего описал бы его.

Предположим, у меня есть игра, в которой у игрока есть инвентарь. В инвентаре есть элементы, и каждый элемент имеет базу данных, поэтому две копии одного и того же элемента могут просто указывать на одну и ту же запись в базе данных. Когда что-то нужно взять из инвентаря игрока, они не имеют явного знания самого элемента, а вместо этого просто знают, какой идентификатор элемента БД им нужно удалить. Кроме того, элементы хранятся в их handleId (уникальном), который используется для клиентских пользовательских интерфейсов (уникальный дескриптор передается интерфейсу, так что UIItem в основном имеет своего рода идентификатор обратного вызова)

Псевдопользователей-код:

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.

Теперь, если пользовательский интерфейс хочет удалить элемент (т.е. Игрок перетащил его в мусорный ящик), существует общедоступный метод, который отделяет знания. Если NPC хочет удалить элемент (просто скажите, что NPC ворует, когда он касается игрока, и ищет определенный ItemId), тогда он также имеет открытый метод, который отделяет знания.

Мой вопрос, во-первых, имеет ли этот шаблон имя, или это переменная другого шаблона, который я не вижу? Во-вторых, это хорошая практика или плохая практика? Для меня это хорошо, но я мог бы что-то упустить.

Теги:
design-patterns

1 ответ

3

Похоже, я похож на пример учебника по методу Flyweight.

Мухи - это объект, который минимизирует использование памяти путем совместного использования как можно большего количества данных с другими подобными объектами; это способ использовать объекты в больших количествах, когда простое повторное представление будет использовать недопустимый объем памяти. Часто некоторые части состояния объекта могут быть разделены, и распространенная практика заключается в том, чтобы удерживать их во внешних структурах данных и временно передавать их на объекты мухи, когда они используются.

  • 0
    Этот объект содержит фактические данные, он не разделяет и не минимизирует какую-либо память, он только предоставляет интерфейс, отличный от контейнера, хранящегося внутри
  • 0
    +1 Дэвид. Я использую шаблон flyweight для оптимизации доступа к базе данных, но я обращаюсь к самому экземпляру элемента с использованием различных открытых методов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню