Что такое шаблон проектирования и стратегия для запроса базовой системы для действий [C #, PHP] - PullRequest
0 голосов
/ 16 июля 2009

Я играю в RogueLike и хотел бы сделать логику для каждой сущности модульной. Это, вероятно, может относиться к веб-приложениям, где есть роли и контроль доступа.

Идея состоит в том, чтобы иметь что-то вроде этого - у нас есть разные типы сущностей в игре. дверь можно разбить, а каменную стену не разбить. Скажем, логическим модулем может быть класс с именем Bashable

public interface IBashable
{
    bool ProcessRequest(CharacterInfo character);
    string GetOutput();
    virtual int GetOutcome();
}

Таким образом, дверь с интерфейсом IBashable, добавленным к объекту, может быть разбита. ProcessReques () будет использовать некоторые правила, чтобы определить, удастся ли персонажу это сделать (возможно, проверка силы).

Объект без интерфейса IBashable нельзя открыть открытым. Проблема в том, что к двери добавлено несколько логических компонентов. То, что я хотел бы сделать, это отправить запрос, как это.

// Conan is derived from CharacterInfo class
BashDoorRequest request = new BashDoorRequest(conan);
Door d;
BashLogic bash;
PickLockLogic pick;
d.addLogic(bash);
d.addLogic(pick);

// Assuming the signature is processRequest(IRequest, where all request derived from)
d.processRequest(request)

Вопрос - как добавить getmodules для активации? Это BashDoorRequest, а не PickLockRequest, поэтому будет работать только логика bash door.

У меня два размышления - одно - использовать шаблон посетителя, но это означает, что добавлено довольно много классов. Другой - иметь тег или идентификатор для каждого модуля досягаемости и действия. Например, логика bash может иметь тег «bash». Может быть, у меня есть две логики bash - одна позволяет игрокам взламывать дверь, а другая может быть, что уменьшает HP любого, кто бьет дверь, потому что она имеет шипы.

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

Это также относится к местности; скажем, персонажи не могут двигаться сквозь воду. Водный объект имеет только ICannotWalk через добавленную логику, но имеет добавленную ISwimmable логику. Так как же проверить только модуль ICannotWalk, не теряя времени на проверку логики ISwimmable?

Другая проблема, с которой я сталкиваюсь, заключается в том, что объект запроса может принимать более одного параметра, но передача хеш-таблицы для представления параметров кажется мне излишним. Не говоря уже о том, что некоторые логические модули могут принимать разные параметры. (Например, дверь заперта, и для ее открытия требуется специальный ключ. Запрос на это будет включать и инвентарь персонажа, а не информацию о нем. Если я не передам весь инвентарь, характеристики персонажа и все остальное в Запрос.

Будут приветствоваться любые идеи по внедрению этой системы!

Ответы [ 2 ]

1 голос
/ 16 июля 2009

Возможно, вы захотите прочитать о шаблоне команды - то, что вы называете запросом, по сути является командой. Каждый объект может поддерживать список CommandActions, и при передаче команды попытаться сопоставить каждую команду со списком доступных CommandActions.

Эффективная диспетчеризация команд часто является проблемой, особенно когда объекты могут реагировать на множество различных команд. Существует несколько различных способов решения проблем с производительностью:

  • Использование словаря для сопоставления каждой команды ее действию на основе ключа, общего для двух
  • Использование группировок диапазонов команд для сужения поиска действия на основе ключевых диапазонов
  • Назначьте каждой команде уникальный числовой идентификатор и используйте бинарный поиск в упорядоченной коллекции, чтобы найти действия
  • Если на команду может ответить несколько действий, объедините их в цепочку
  • Используйте специальные методы для отправки общих команд, а не общий метод ProcessRequest ()
0 голосов
/ 16 июля 2009

Может быть, шаблон Command Dispatcher может помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...