В основном есть два хороших способа:
Преимущество использования OO над неизменяемыми объектами над наивными команда или наивное undo / redo - вам не нужно много об этом думать: не нужно «отменять» действие и не нужно «переигрывать» все команды. Все, что вам нужно, это указатель на огромный список неизменяемых объектов.
Поскольку объекты неизменны, все «состояния» могут быть невероятно легкими, потому что вы можете кэшировать / повторно использовать большинство объектов в любом состоянии.
«OO над неизменными объектами» - это чистая жемчужина. Вероятно, он не станет мейнстримом еще до 10 лет. )
P.S: выполнение OO над неизменяемыми объектами также удивительно упрощает параллельное программирование.