Цитата:
Сообщение от expl
Чем тогда это отличается от 2-го варианта?
Всмысле при сохранении изменений (например, вместе с коммандами) получаем состояния:
1:добавить круг в 0, 0 ->
2:добавить прямоугольник в 0, 0 ->
3:повернуть прямоугольник на 90º->
4:Удалить прямоугольник
Вариант с состояниями:
1:круг(0,0) ->
2:[ссылка на 1:], прямоугольник(0, 0, 0º) ->
3:[ссылка на 1:], прямоугольник(0, 0, 90º) ->
4:[ссылка на 1:]
Как бы получение структуры [3:[ссылка на 1:], прямоугольник(0, 0, 90º)] по предыдущей [2:[ссылка на 1:], прямоугольник(0, 0, 0º)] и действиям пользователя уже выглядит нетривиально
- Как компактно сохранить состояния не сохраняя изменений?
- Как это сделать просто на _нефункциональном_ языке?
- А если таки сохранять изменения, а не данные, то в чём разница?
- Зачем это всё, если можно просто сохранить изменение вместо сохранения состояния? - И вычислять ничего не надо будет - никаких дифов между старым и новым снимать не надо
|
Как вариант воспользоваться одним из поведенческих шаблонов проектирования. Например шаблон "Состояние".
Состоит из следующих компонентов:

Код:
1. Интерфейс состояния
2. Контекстный класс
3. Классы контекста состояния
4. Клиент

Код AS3:
package
{
//State Machine Interface
// Интерфейс автомата состояний
interface State
{
function startPlay():void;
function stopPlay():void;
}
}

Код AS3:
package
{
//Context class
// Контекстный класс
class VideoWorks
{
var playState:State;
var stopState:State;
// Переменная для хранения текущего состояния
var state:State;
public function VideoWorks()
{
trace("Video Player is On");
playState = new PlayState(this);
stopState = new StopState(this);
state = stopState;
}
public function startPlay():void
{
state.startPlay();
}
public function stopPlay():void
{
state.stopPlay();
}
// Методы получатели и установщики
public function setState(state:State):void
{
trace("A new state is set");
this.state = state;
}
public function getState():State
{
return state;
}
public function getPlayState():State
{
return this.playState;
}
public function getStopState():State
{
return this.stopState;
}
}
}

Код AS3:
package
{
//Play State
// Класс контекстного состояния: состояние проигрывания
class PlayState implements State
{
var videoWorks:VideoWorks;
public function PlayState(videoWorks:VideoWorks)
{
trace("--Play State--");
this.videoWorks = videoWorks;
}
public function startPlay():void
{
trace("You're already playing");
}
public function stopPlay():void
{
trace("Stop playing.");
videoWorks.setState(videoWorks.getStopState());
}
}
}

Код AS3:
package
{
//Stop State;
// Класс контекстного состояния: проигрывание остановлено
class StopState implements State
{
// Доступ к методам установщикам и получателям для каждого состояния
var videoWorks:VideoWorks;
public function StopState(videoWorks:VideoWorks)
{
trace("--Stop State--");
this.videoWorks = videoWorks;
}
public function startPlay():void
{
trace("Begin playing");
videoWorks.setState(videoWorks.getPlayState());
}
public function stopPlay():void
{
trace("You're already stopped");
}
}
}

Код AS3:
package
{
//Test states
// Тестируем состояния: Клиент
import flash.display.Sprite;
public class TestState extends Sprite
{
public function TestState( ):void
{
var test:VideoWorks = new VideoWorks( );
test.startPlay( );
test.startPlay( );
test.stopPlay( );
test.stopPlay( );
}
}
}