PDA

Просмотр полной версии : реализация специфического поведения


Appleman
04.07.2018, 11:23
Друзья!

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

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

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

А вот как в обратную сторону сделать? Наследование и переопределение сеттера не подходит, т.к. подобное поведение является временным. Понятно, что если подобные эффекты единичны, то можно и if вкатать да проверить, но как-то это не по-православному.

ZergMaster
04.07.2018, 12:59
Ну, если у нас уже есть экземпляр, то чтобы временно изменить свойства персонажа, можно оборачивать его в Декоратор.. Будет какой-нибудь var zombie = ZombieDecorator(character). И подменять им персонажа. Декоратор будет модифицировать воздействия нужным образом.
Либо, если хочется скрыть все это внутри персонажа, то можно и внутрь него внедрить декоратор. При этом публичные методы не будут знать, с кем именно они работают - они будут работать просто с интерфейсом iChar каким-нибудь. Просто в какой-то момент ты будешь подменять чара декоратором

Добавлено через 2 часа 26 минут
а еще можно через по умолчанию пустой Адаптер все влияния, такие, как дамаг и прочее.. И при разных воздействии просто втыкать нужный адаптер в метод setAdapter - ZombieAdapter, IceAdapter, VampierAdapter, StoneAdapter и т.п. ..

Appleman
05.07.2018, 09:42
ZergMaster, спасибо.

СлаваRa
05.07.2018, 10:39
Декоратор - нужен для динамического добавления функциональности объекту к его основной.
Адаптер - приводит один интерфейс к другому.

@ZergMaster как у вас структурные шаблоны стали поведенчискими, для меня остается загадкой.

UPD
ну и тут ситуация в двух словах: "объект поменял свое состояние из-за чего поменялось его поведение"

Appleman
05.07.2018, 11:37
UPD
ну и тут ситуация в двух словах: "объект поменял свое состояние из-за чего поменялось его поведение"

СлаваRa, спасибо, исчерпывающе. Концепт понятен. Пойду освежу соответствующий шаблон, чтобы на его базе что-нибудь замутить.

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

СлаваRa
05.07.2018, 11:51
Как уважаемая аудитория относится к назначению свойств-маркеров, влияющих на поведение объекта?
Я не знаю как это интерпретировать, поэтому никак к этому не отношусь.

Appleman
05.07.2018, 12:37
Ну вот так:

public class SomeClass
{
private var _multMode: Boolean;

function someCalculation(value1: Number, value2: Number) : Number
{
if (_multMode) return value1 * value2;
else return value1 + value2;
}
}

То есть когда в классе заводятся свойства, значение которых определяют поведение. В общем то, что ты предложил, но в таком топорном варианте :)

ZergMaster
05.07.2018, 13:25
СлаваRa
прикольно. Примерно это я и имел ввиду, когда говорил про декоратор внутри чара, и чтобы был метод changeDecorator, который подменивает методы. Адаптер подходит в том смылсе, что мы как раз соединяем два интерфеса - интерфейс зомби накладываем на интерфейс чара.
Но да, паттерн State тут подходит идеально, это именно он и есть, просто я его не знал/забыл, вот и вывалил велосипед. )

Appleman
05.07.2018, 17:51
Главное ограничение шаблона "Состояние" - это организация состояний как взаимоисключающих элементов, в соответствии с теорией конечных автоматов. Теперь нужно покумекать над реализацией пребывания объекта одновременно в нескольких состояниях :)

СлаваRa
05.07.2018, 18:01
Вот представь, что есть физически здоровые люди, с расстройством психи. Его физическое состояние в норме, его психологическое состояние нет, но они не исключающие друг друга, как например живое не может быть мертвым и наоборот, все всегда зависит от постановки(формулировки) задачи.

Appleman
05.07.2018, 18:07
СлаваRa, да, я примерно о том же и думаю - реализовать состояния, управляющие отдельными аспектами поведения объекта. В любом случае спасибо за наводку.

dimarik
05.07.2018, 21:27
а еще можно через по умолчанию пустой Адаптер все влияния, такие, как дамаг и прочее.. И при разных воздействии просто втыкать нужный адаптер в метод setAdapter - ZombieAdapter, IceAdapter, VampierAdapter, StoneAdapter и т.п. ..

Все верно, дружище! Только это не Адаптер (https://ru.wikipedia.org/wiki/%D0%90%D0%B4%D0%B0%D0%BF%D1%82%D0%B5%D1%80_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0 %BD%D0%B8%D1%8F)), а паттерн из поведенческой династии (https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0% BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F), и называется он "Стратегия" (https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D1%8F_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0 %B2%D0%B0%D0%BD%D0%B8%D1%8F)). Хотя, если подумать, то "Состояние" (https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0 %B2%D0%B0%D0%BD%D0%B8%D1%8F)) самое оно.

Тонкая разница (https://stackoverflow.com/questions/1658192/what-is-the-difference-between-strategy-design-pattern-and-state-design-pattern) вроде обсуждалась )