Режим статуса
Режим состояния позволяет объекту изменять свое поведение при изменении его внутреннего состояния, и объект, по -видимому, изменяет свой класс.
Сценарии использования режима статуса также особенно ясны, со следующими двумя точками:
1. Поведение объекта зависит от его состояния, и оно должно изменить свое поведение в соответствии с его состоянием во время выполнения. (В некоторых объектах обычно есть несколько состояний в каждом штате, вы можете делать только то, что может сделать текущее состояние, но не то, что могут сделать другие государства)
2. Операция содержит большое количество операторов ветвления, и эти отраслевые операторы зависят от состояния объекта. Государство обычно является представлением одной или нескольких констант перечисления.
1. конечный штат Машина
1. Общее количество состояний (штат) ограничено.
2. В любой момент вы находитесь только в одном состоянии.
3. При определенных условиях он переходит от одного состояния к другому.
Обычная практика: инкапсулировать состояние в независимый класс (штатный аппарат) и делегировать запрос на текущий объект состояния. Когда внутреннее состояние объекта изменится, это приведет к различным изменениям поведения.
2. Точки оптимизации производительности
1. Как управлять созданием и уничтожением государственных объектов? Во -первых, это создание, а затем уничтожить объекты состояния только тогда, когда они необходимы (объекты состояния огромны, предпочтительны), а другой - создавать все объекты состояния с самого начала и никогда не уничтожать их (часто изменяется).
2. Используйте режим наслаждения юаней, чтобы поделиться объектом состояния.
Чтобы привести немного сложный пример, я считаю, что все играли в ролевые игры, и у персонажей в нем много состояний (станция, ходьба, бег, прыжки, приседание и т. Д.). Указано переключение между различными состояниями, и они могут быть только в одном состоянии в любое время. В каждом состоянии персонажи могут выполнять только разрешенное поведение в текущем состоянии (например: обычные атаки, различные навыки, защита и т. Д.)
Вот пример движущегося мяча, который я написал:
<! Doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> </title> <script> window.onload = function () {var fsm = {show1: {clickbtn: function (key) {change.call (this, key); }}, show2: {clickbtn: function (key) {change.call (this, key); }}, show3: {clickbtn: function (key) {change.call (this, key); }}, show4: {clickbtn: function (key) {change.call (this, key); }}}}; var ball = function () {this.curentstate = fsm.show1; this.div = null; }; Ball.prototype.init = function () {var self = this; this.div = document.getElementById ('Go'); document.body.onkeydown = function (event) {var key = event.keycode; self.curentstate.clickbtn.call (self, key); }}; изменение функции (ключ) {var styles = window.getComputeDStyle (this.Div), parentStyles = window.getComputEdstyle (this.div.parentNode), top = parseint (styles.top), left = parseint (styles.left); if (key === 40) {top += (top +parseint (styles.height)) <parseint (parentStyles.height)? 10: 0; this.div.style.top = top+'px'; this.currentState = fsm.show3; } if (key === 38) {top -= (top> 0? 10: 0); this.div.style.top = top+'px'; this.curentstate = fsm.show4; } if (key === 37) {left -= (слева> 0? 10: 0); this.div.style.left = Left+'px'; this.curentstate = fsm.show1; } if (key === 39) {this.curentState = fsm.show2; слева += (слева +parseint (styles.width)) <parseint (parentStyles.width)? 10: 0; this.div.style.left = Left+'px'; }} var a = new Ball (); a.init (); } </script> <style> #div {position: Absolute; Ширина: 80%; высота: 80%; Верх: 0; Внизу: 0; слева: 0; Справа: 0; Порность: Авто; Граница: 1px твердый темный; } #go {position: Absolute; Ширина: 50px; Высота: 50px; Слева: 10px; Верх: 20px; Граница: 1px сплошной серый; -Вебкит-грамотный радий: 50px; -Моз-грамотный радий: 50px; граница радий: 50px; Справочный изображение: радиальное градиент (круг, белый 5%, черный 100%); } </style> </head> <body> <div id = "div"> нажмите клавишу со стрелкой, чтобы переместить квадрат <div id = "go"> </div> </div> </body> </html>3. Javascript версия State Machine (в качестве примера приобретает простые огни коммутатора)
1. напрямую делегируйте запрос в буквальный объект через метод function.prototype.call для выполнения
// State Machine var fsm = {off: {buttonwaspressed: function () {console.log ("Downlight"); this.button.innerhtml = "Далее нажатие я включаю свет"; // Это свойство на свете! ! ! this.currstate = fsm.on; // Это свойство на свете! ! ! }}, on: {buttonwaspressed: function () {console.log ("Light on"); this.button.innerhtml = "Далее нажатие я выключаю свет"; this.currstate = fsm.off; }},}; var light = function () {this.currstate = fsm.off; // Установить текущее состояние this.button = null;}; Light.prototype.init = function () {var button = document.createElement ("кнопка"); self = это; button.innerhtml = "Light Off"; this.button = document.body.appendchild (кнопка); this.button.onclick = function () {// запрос на делегирование в государственную машину FSM Self.currstate.buttonwaspressed.call (self); }} var light = new Light (); light.init ();2. Используйте функцию делегата
var delegate = function (client, delegation) {return {buttonwaspressed: function () {return delegation.buttonwaspressed.apply (client, arguments); }};}; // State Machine var fsm = {off: {buttonwaspressed: function () {console.log ("off"); this.button.innerhtml = "Далее нажатие я включаю свет"; this.currstate = this.onstate; }}, on: {buttonwaspressed: function () {console.log ("на свете"); this.button.innerhtml = "Далее нажатие, я выключаю свет"; this.currstate = this.offstate; }},}; var light = function () {this.offstate = делегат (this, fsm.off); this.onstate = делегат (это, fsm.on); this.currstate = this.offstate; // Установить текущее состояние this.button = null;}; Light.prototype.init = function () {var button = document.createElement ("кнопка"); self = это; button.innerhtml = "Light Off"; this.button = document.body.appendchild (кнопка); this.button.onclick = function () {// запрос на делегирование в государственную машину FSM Self.currstate.buttonWaspressed (); }} var light = new Light (); light.init ();Государственные режимы и режимы политики очень похожи. Они оба инкапсулируют ряд алгоритмов или поведения. Все они имеют контекстный объект для делегирования запросов на инкапсулированные классы (классы политики, государственные машины), но их намерения разные:
1. Различные атрибуты класса политики одинаково параллельны, и между ними нет никакой связи.
2. Существует взаимное переключение между различными состояниями в состоянии состояния, и это указано.
Список литературы: «Паттерн JavaScript» «Образец проектирования и разработки JavaScript»
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.