представлять
Режим состояния позволяет объекту изменять свое поведение при изменении его внутреннего состояния, и объект, по -видимому, изменяет свой класс.
текст
Например, когда мы загружаем вещи, у нас обычно есть несколько штатов, таких как готовый участок, загрузка штата, приостановка штата, скачивание штата, скачивание поступок и Fail. То есть в каждом штате вы можете делать только то, что может сделать текущее состояние, но не то, что могут сделать другие государства.
Потому что шаблон состояния описывает, как загрузки (загрузки) ведут себя по -разному в каждом состоянии. Ключевая идея этого шаблона состоит в том, чтобы ввести абстрактный класс, называемый состоянием (или функцией в JS), чтобы представлять состояние загрузки. Функция состояния (как прототип) объявляет некоторые общие интерфейсы для подклассов (функции наследования) каждого состояния. Каждая функция наследования реализует поведение, связанное с конкретным состоянием, таким как загрузка штата и загрузка штата, соответственно, реализует поведение, загружаемое и загружаемое. Это поведение можно поддерживать с помощью загрузки.
Давайте внедрим игру, сначала определим функцию состояния как прототип других основных функций:
Кода -копия выглядит следующим образом:
var state = function () {
};
State.prototype.download = function () {
Выбросить новую ошибку («Этот метод должен быть перегружен!»);
};
State.prototype.pause = function () {
Выбросить новую ошибку («Этот метод должен быть перегружен!»);
};
State.prototype.fail = function () {
Выбросить новую ошибку («Этот метод должен быть перегружен!»);
};
State.prototype.finish = function () {
Выбросить новую ошибку («Этот метод должен быть перегружен!»);
};
Мы определяем 4 интерфейса метода для прототипа состояния, которые соответствуют загрузке (скачать), паузу, сбой и заканчиваются, чтобы подфункция была переписана.
Перед написанием подфункции мы сначала записываем функцию готового участка, чтобы состояние было передано в первое состояние загрузки:
Кода -копия выглядит следующим образом:
var reateState = function (odownload) {
State.apply (это);
this.Odownload = odownload;
};
Readystate.prototype = new State ();
Readystate.prototype.download = function () {
this.Odownload.setState (this.Odownload.getDownloadingState ());
// после готового вы можете начать загрузку, поэтому вы устанавливаете метод получения состояния в функции загрузки
console.log ("Start Download!");
};
Readystate.prototype.pause = function () {
Выбросить новую ошибку («Скачать еще не началась, не может быть приостановлен!»);
};
Readystate.prototype.fail = function () {
Выбросить новую ошибку («Файл еще не начал загружать, как можно сказать, что он не удался!»);
};
Readystate.prototype.finish = function () {
Выбросить новую ошибку («Файл не начал загружать, конечно, он не может быть закончен!»);
};
Эта функция принимает экземпляр функции обслуживания загрузки в качестве параметра. Функция загрузки используется для управления изменениями состояния и приобретений (аналогично центральному контроллеру, позволяющему внешним вызовам). Readystate Переписывает метод загрузки прототипа для начала загрузки. Давайте продолжим смотреть на основные функции функции загрузки:
Кода -копия выглядит следующим образом:
var скачать = function () {
this.ostate = new Readystate (это);
};
Скачать.prototype.setState = function (ostate) {
this.ostate = ostate;
};
// четыре публичных метода, подвергшихся воздействию внешних вызовов
Загрузить.prototype.download = function () {
this.ostate.download ();
};
Загрузить.prototype.pause = function () {
this.ostate.pause ();
};
Загрузить.prototype.fail = function () {
this.ostate.fail ();
};
Загрузить.prototype.finish = function () {
this.ostate.finish ();
};
// Получить различные состояния и пройти в текущий этот объект
Скачать.prototype.getReadyState = function () {
вернуть новую QueadState (это);
};
Скачать.prototype.getDownloadingState = function () {
вернуть New DownloadState (это);
};
Скачать.prototype.getDownloadPausedState = function () {
вернуть New DownloadPausedState (это);
};
Скачать.prototype.getDownLoadedState = function () {
вернуть New DownloadedState (это);
};
Загрузка.prototype.getDownLoadedFailedState = function () {
вернуть New DownloadFailedState (это);
};
Прототип функции загрузки предоставляет 8 методов, 4 - это оперативное поведение для загрузки состояний, а остальные 4 используются для получения текущих четырех разных состояний. Все эти 4 метода получают это в качестве параметра, то есть передавать сам экземпляр загрузки в качестве параметра для объекта состояния (готовый участок и функция наследования, которая будет реализована позже), что делает объект состояния доступным для Odownlaod, чем при необходимости.
Далее, продолжайте определять 4 функции связанных состояний:
Кода -копия выглядит следующим образом:
var DoucdelingState = function (odownload) {
State.apply (это);
this.Odownload = odownload;
};
Загрузка state.prototype = new state ();
Скачивание state.prototype.download = function () {
Выбросить новую ошибку («Файл уже загружается!»);
};
Скачивание state.prototype.pause = function () {this.odownload.setState (this.Odownload.getDownloadPausedState ());
console.log ("Пауза скачать!");
};
Скачивание state.prototype.fail = function () {this.odownload.setState (this.Odownload.getDownloadedFailedState ());
console.log («Скачать не удалась!»);
};
Скачивание state.prototype.finish = function () {
this.Odownload.setState (this.Odownload.getDownLoadedState ());
console.log ("скачал!");
};
Главное, что нужно отметить в отношении загрузки State, - это то, что файл, который уже загружается, не может быть загружен снова, а другие состояния могут быть непрерывно выполнять.
Кода -копия выглядит следующим образом:
var downloadpausedState = function (odownload) {
State.apply (это);
this.Odownload = odownload;
};
DownloadpausedState.prototype = new State ();
DownloadpausedState.prototype.download = function () {
this.Odownload.setState (this.Odownload.getDownloadingState ());
console.log («Продолжить скачать!»);
};
DownloadpausedState.prototype.pause = function () {
Бросьте новую ошибку («Это было приостановлено, почему вам все еще нужно сделать паузу!»);
};
DownloadpausedState.prototype.fail = function () {this.odownload.setState (this.Odownload.getDownloadedFailedState ());
console.log («Скачать не удалась!»);
};
DownloadpausedState.prototype.finish = function () {
this.Odownload.setState (this.Odownload.getDownLoadedState ());
console.log ("скачал!");
};
Это должно быть отмечено в функции DownloadPausedState, что загрузки, которые были приостановлены, не могут быть приостановлены снова.
Кода -копия выглядит следующим образом:
var скачали statate = function (odownload) {
State.apply (это);
this.Odownload = odownload;
};
Скачание statate.prototype = new State ();
Скачание statate.prototype.download = function () {
this.Odownload.setState (this.Odownload.getDownloadingState ());
console.log ("re-download!");
};
Загрузка statate.prototype.pause = function () {
Выбросить новую ошибку («Что еще вы сделаете паузу после загрузки?»);
};
Загрузка statate.prototype.fail = function () {
Выбросить новую ошибку («Загрузка была успешной, почему она потерпит неудачу?»);
};
Скачание statate.prototype.finish = function () {
Выбросить новую ошибку («Скачать успешна, вы больше не можете этого делать!»);
};
Function FunctionState, аналогичным образом, после успешной загрузки вы больше не можете установить завершение, вы можете установить только статус повторной загрузки.
Кода -копия выглядит следующим образом:
var DownloadFailedState = function (odownload) {
State.apply (это);
this.Odownload = odownload;
};
Downloadfailedstate.prototype = new State ();
Downloadfailedstate.prototype.download = function () {
this.Odownload.setState (this.Odownload.getDownloadingState ());
console.log («Попробуйте повторно загрузить!»);
};
Downloadfailedstate.prototype.pause = function () {
Выбросить новую ошибку («Не удастся загрузить нельзя приостановить!»);
};
Downloadfailedstate.prototype.fail = function () {
Бросьте новую ошибку («Все не удалось, почему это все еще не удалось!»);
};
Downloadfailedstate.prototype.finish = function () {
Выбросить новую ошибку («Неудача скачать определенно не преуспеет!»);
};
Точно так же состояние сбоя функции DownloadFailedState снова не может выйти из строя, но вы можете попытаться загрузить ее снова после завершения.
Вызов тестового кода очень прост. Давайте продемонстрируем это в HTML. Во-первых, вам нужно jQuery, а затем представляют 3 кнопки: запустить загрузку, паузу и повторную загрузку. (Обратите внимание, что вы используете Firebug для просмотра результатов в Firefox, потому что используется метод консоли.log).
Кода -копия выглядит следующим образом:
<html>
<голова>
<Link Type = "text/css" rel = "styleSheet" href = "http://www.cnblogs.com/css/style.css"/>
<title> шаблон состояния </title>
<script type = "text/javascript" src = "/jquery.js"> </script>
<script type = "text/javascript" src = "download.js"> </script>
<script type = "text/javascript" src = "states/state.js"> </script>
<script type = "text/javascript" src = "stass/downloadfailedstate.js"> </script>
<script type = "text/javascript" src = "stass/downloadpausedstate.js"> </script>
<script type = "text/javascript" src = "stass/downloadedstate.js"> </script>
<script type = "text/javascript" src = "stass/downloadingstate.js"> </script>
<script type = "text/javascript" src = "stass/readystate.js"> </script>
</head>
<тело>
<input type = "button" value = "Start Download" id = "Download_button" />
<input type = "button" value = "pause" id = "pause_button" />
<input type = "button" value = "re-download" id = "resume_button" />
<script type = "text/javascript">
var Odownload = new Download ();
$ ("#Download_button"). Click (function () {
odownload.download ();
});
$ ("#pause_button"). Click (function () {
odownload.pause ();
});
$ ("#resume_button"). Click (function () {
odownload.download ();
});
</script>
</body>
</html>
Суммировать
Сценарии использования режима статуса также особенно ясны, со следующими двумя точками:
1. Поведение объекта зависит от его состояния, и оно должно изменить свое поведение в соответствии с его состоянием во время выполнения.
2. Операция содержит большое количество операторов ветвления, и эти отраслевые операторы зависят от состояния объекта. Государство обычно является представлением одной или нескольких констант перечисления.