Показать сообщение отдельно
Старый 21.03.2013, 02:48
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 11  
Ответить с цитированием
yasha005

Регистрация: Dec 2012
Сообщений: 100
У меня конечно изначально была идея взять за основу шаблон состояние:

Код AS3:
package server_exchange.socket_4444
{
	// Состояние: Контекстный класс
	internal class WorksSocket
	{
		/*//////////////////////////////////////
			Список состояний
		//////////////////////////////////////*/
 
		// Соединение с сокетом не установлено (ожидаются действия)
		private var state1No:IState;
		// Соединение с сокетом устанавливается
		private var state2SocketConnecting:IState;
		// Соединение с сокетом успешно установлено (ожидаются действия)
		private var state3SocketEstablished:IState;
		// Выполняется отправка данных на сервер
		private var state4SocketReading:IState;
		// Выполняется приём данных с сервера
		private var state5SocketWriting:IState;
 
		// Текущее состояние
		private var iStateSocket:IState;
 
		public function WorksSocket()
		{
			// Инициализируем все конкретные состояния
			this.state1No = new State1No(this);
			this.state2SocketConnecting = new State2SocketConnecting(this);
			this.state3SocketEstablished = new State3SocketEstablished(this);
			this.state4SocketReading = new State4SocketReading(this);
			this.state5SocketWriting = new State5SocketWriting(this);
 
			// Устанавливаем первоначальный статус при инициализации конструктора
			this.iStateSocket = this.state1No;
		}
 
		/*/////////////////////////////////////////////////////
			Выполнение события в установленном состоянии
		/////////////////////////////////////////////////////*/
 
		public function set ExecuteState(comand:String):void
		{
			switch(comand)
			{
				case ComandName._command1SocketConnect: this.iStateSocket.Command1SocketConnect(); break;
				case ComandName._command2SocketConnecting: this.iStateSocket.Command2SocketConnecting(); break;
				case ComandName._command3SocketWrite: this.iStateSocket.Command3SocketWrite(); break;
				case ComandName._command4SocketRead: this.iStateSocket.Command4SocketRead(); break;
			}
		}
 
		/*/////////////////////////////////////////////////////
			Устанавливает состояние
		/////////////////////////////////////////////////////*/
 
		public function set SetState(state:String):void
		{
			switch(state)
			{
				case StateName._state1No: this.iStateSocket = this.state1No; break;
				case StateName._state2SocketConnecting: this.iStateSocket = this.state2SocketConnecting; break;
				case StateName._state3SocketEstablished: this.iStateSocket = this.state3SocketEstablished; break;
				case StateName._state4SocketReading: this.iStateSocket = this.state4SocketReading; break;
				case StateName._state5SocketWriting: this.iStateSocket = this.state5SocketWriting; break;
			}
		}
 
 
	} // Конец класса
} // Конец пакета
Интерфейс состояний:
Код AS3:
package server_exchange.socket_4444
{
	// Состояние: команды для выполнения действий в каком-либо из состояний
	internal interface IState
	{
		// Выполняет команду на соединение с сокетом
		function Command1SocketConnect():void;
		// Связь с сокетом устанавливается
		function Command2SocketConnecting():void;
		// Связь с сокетом установлена, выполняется отсылка данных на сервер (запись в сокет)
		function Command3SocketWrite():void;
		// Связь с сокетом установлена, выполняется приём данных с сервера (чтение из сокета)
		function Command4SocketRead():void
	}
}

Действия состояний:
Код AS3:
package server_exchange.socket_4444
{
	// Действия, выполняемые в каком-либо состоянии
	internal class ComandName
	{
		// Выполняет команду на соединение с сокетом
		internal static const _command1SocketConnect:String = 'Command1SocketConnect';
		// Связь с сокетом устанавливается
		internal static const _command2SocketConnecting:String = 'Command2SocketConnecting';
		// Связь с сокетом установлена, выполняется отсылка данных на сервер (запись в сокет)
		internal static const _command3SocketWrite:String = 'Command3SocketWrite';
		// Связь с сокетом установлена, выполняется приём данных с сервера (чтение из сокета)
		internal static const _command4SocketRead:String = 'Command4SocketRead';
	}
}

Непосредственно сами состояния:
Код AS3:
package server_exchange.socket_4444
{
	// Конкретное состояние
	internal class StateName
	{
		// Соединение с сокетом не установлено (ожидаются действия)
		internal static const _state1No:String = 'State1No';
		// Соединение с сокетом устанавливается
		internal static const _state2SocketConnecting:String = 'State2SocketConnecting';
		// Соединение с сокетом успешно установлено (ожидаются действия)
		internal static const _state3SocketEstablished:String = 'State3SocketEstablished';
		// Выполняется отправка данных на сервер
		internal static const _state4SocketReading:String = 'State4SocketReading';
		// Выполняется приём данных с сервера
		internal static const _state5SocketWriting:String = 'State5SocketWriting';
	}
}

Описание состояний:
Код AS3:
package server_exchange.socket_4444
{
	internal class State1No implements IState
	{
		// Состояние
		private var worksSocket:WorksSocket;
 
		public function State1No(worksSocket:WorksSocket)
		{
			this.worksSocket = worksSocket;
		}
 
		// Выполняет команду на соединение с сокетом
		public function Command1SocketConnect():void { }		
		// Связь с сокетом устанавливается
		public function Command2SocketConnecting():void { }
		// Связь с сокетом установлена, выполняется отсылка данных на сервер (запись в сокет)
		public function Command3SocketWrite():void { }
		// Связь с сокетом установлена, выполняется приём данных с сервера (чтение из сокета)
		public function Command4SocketRead():void { }
 
	}
}
Код AS3:
package server_exchange.socket_4444
{
	internal class State2SocketConnecting implements IState
	{
		// Состояние
		private var worksSocket:WorksSocket;
 
		public function State2SocketConnecting(worksSocket:WorksSocket)
		{
			this.worksSocket = worksSocket;
		}
 
		// Выполняет команду на соединение с сокетом
		public function Command1SocketConnect():void { }		
		// Связь с сокетом устанавливается
		public function Command2SocketConnecting():void { }
		// Связь с сокетом установлена, выполняется отсылка данных на сервер (запись в сокет)
		public function Command3SocketWrite():void { }
		// Связь с сокетом установлена, выполняется приём данных с сервера (чтение из сокета)
		public function Command4SocketRead():void { }
 
	}
}
Код AS3:
package server_exchange.socket_4444
{
	internal class State3SocketEstablished implements IState
	{
		// Состояние
		private var worksSocket:WorksSocket;
 
		public function State3SocketEstablished(worksSocket:WorksSocket)
		{
			this.worksSocket = worksSocket;
		}
 
		// Выполняет команду на соединение с сокетом
		public function Command1SocketConnect():void { }		
		// Связь с сокетом устанавливается
		public function Command2SocketConnecting():void { }
		// Связь с сокетом установлена, выполняется отсылка данных на сервер (запись в сокет)
		public function Command3SocketWrite():void { }
		// Связь с сокетом установлена, выполняется приём данных с сервера (чтение из сокета)
		public function Command4SocketRead():void { }
 
	}
}
Код AS3:
package server_exchange.socket_4444
{
	internal class State4SocketReading implements IState
	{
		// Состояние
		private var worksSocket:WorksSocket;
 
		public function State4SocketReading(worksSocket:WorksSocket)
		{
			this.worksSocket = worksSocket;
		}
 
		// Выполняет команду на соединение с сокетом
		public function Command1SocketConnect():void { }		
		// Связь с сокетом устанавливается
		public function Command2SocketConnecting():void { }
		// Связь с сокетом установлена, выполняется отсылка данных на сервер (запись в сокет)
		public function Command3SocketWrite():void { }
		// Связь с сокетом установлена, выполняется приём данных с сервера (чтение из сокета)
		public function Command4SocketRead():void { }
 
	}
}
Код AS3:
package server_exchange.socket_4444
{
	internal class State5SocketWriting implements IState
	{
		// Состояние
		private var worksSocket:WorksSocket;
 
		public function State5SocketWriting(worksSocket:WorksSocket)
		{
			this.worksSocket = worksSocket;
		}
 
		// Выполняет команду на соединение с сокетом
		public function Command1SocketConnect():void { }		
		// Связь с сокетом устанавливается
		public function Command2SocketConnecting():void { }
		// Связь с сокетом установлена, выполняется отсылка данных на сервер (запись в сокет)
		public function Command3SocketWrite():void { }
		// Связь с сокетом установлена, выполняется приём данных с сервера (чтение из сокета)
		public function Command4SocketRead():void { }
 
	}
}
А экземпляр самого XMLSocket вынести в контекстный класс
Код AS3:
package server_exchange.socket_4444
{
	import flash.net.XMLSocket;
	import flash.events.IEventDispatcher;
	import flash.events.Event;
	import flash.events.DataEvent;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	import flash.events.SecurityErrorEvent;
 
	// Структута соединения на сокет
	internal class StructSocket
	{
		private var socket:XMLSocket;
 
		public function StructSocket()
		{
			this.socket = new XMLSocket();
			configureListeners(socket);
            if (hostName && port) 
			{
                socket.connect(hostName, port);
            }
        }
 
        public function send(data:Object):void 
		{
            socket.send(data);
        }
 
        private function configureListeners(dispatcher:IEventDispatcher):void 
		{
            dispatcher.addEventListener(Event.CLOSE, closeHandler);
            dispatcher.addEventListener(Event.CONNECT, connectHandler);
            dispatcher.addEventListener(DataEvent.DATA, dataHandler);
            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        }
 
        private function closeHandler(event:Event):void 
		{
            trace("closeHandler: " + event);
        }
 
        private function connectHandler(event:Event):void 
		{
            trace("connectHandler: " + event);
        }
 
        private function dataHandler(event:DataEvent):void 
		{
            trace("dataHandler: " + event);
        }
 
        private function ioErrorHandler(event:IOErrorEvent):void 
		{
            trace("ioErrorHandler: " + event);
        }
 
        private function progressHandler(event:ProgressEvent):void 
		{
            trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
        }
 
        private function securityErrorHandler(event:SecurityErrorEvent):void 
		{
            trace("securityErrorHandler: " + event);
        }
 
	} // Конец класса
} // Конец пакета
тогда в этом случе будет большое нагромождение, что вобщем-то и тормазнуло процесс дальнейшей разработки