Переделал вот так:

Код AS3:
public class ConnectionController extends EventDispatcher
{
...
protected function dataListener(event:DataEvent):void {
ServerDataEventFactory.CreateDispatchEventFromMessage(event.data, this);
}
}
Это контроллер коннекции с сервером, на нем висят слушатели конкретных событий сообщений приложения.
События приложения создаются здесь:

Код AS3:
public class ServerDataEventFactory
{
private static var EventsTable:Object = {
"table_state":ServerDataTableState,
"user_left":ServerDataUserLeft, # класс события
"user_sit":ServerDataUserSit,
"user_folded":ServerDataUserFolded,
"user_raised":ServerDataUserRaised,
"user_called":ServerDataUserCalled
};
public function ServerDataEventFactory() {
}
/**
* Создает по message соответствующее событие и диспатчит на полученный eventDispatcher
* @param message - сообщение от сервера
*/
public static function CreateDispatchEventFromMessage(message:String,
eventDispatcher:EventDispatcher):void {
var xml:XML = new XML(message);
var klass:Class = EventsTable[xml.localName()];
eventDispatcher.dispatchEvent(klass == null ? new ServerDataUnknown(xml) : new klass(xml));
}
}
Весь код разбора xml для каждого сообщения кусочно индивидуально находится в коде конструкторов классов событий. Все конструкторы событий принимают только один параметр - xml:XML
Т. о., если нужно сменить инсточник сообщений с XMLSoket на что-то другое (таймер, сценарий БДТ тестрирования, то достаточно реализовать xml формат в сообщениях нового источника и за источником ничего переделывать не надо)
wvxvw спасибо)
Добавлено через 22 минуты
Еще хочется при добавлении сообщений вообще не трогать класс ServerData. Т.к. все события по данным от сервера ServerDataUserCalled, ServerDataTableState, .. наследуют от ServerData, это можно попробовать сделать так:

Код AS3:
public class ServerData extends ServerEvent
{
...
//
private static var TokenTable:Array = [];
public static function RegisterClassToken(token:String, klass:Class):void {
TokenTable[token] = klass;
}
public static function ClassFromToken(token:String):Class {
return TokenTable[token];
}
//
...
}
public class ServerDataEventFactory
{
/* это уже не нужно
* private static var EventsTable:Object = { "table_state":ServerDataTableState };
*/
/**
* Создает по message соответствующее событие и диспатчит на полученный eventDispatcher
* @param message - сообщение от сервера
*/
public static function CreateDispatchEventFromMessage(message:String,
eventDispatcher:EventDispatcher):void {
var xml:XML = new XML(message);
var klass:Class = ServerData.ClassFromToken(xml.localName());
eventDispatcher.dispatchEvent(klass == null ? new ServerDataUnknown(xml) :
new klass(xml));
}
}
и в каждом событии регистрировать класс события в классе предке:

Код AS3:
public class ServerDataTableState extends ServerData
{
ServerData.RegisterClassToken("table_state", ServerDataTableState );
...
}
И тут есть вопрос: а зачем вообще регить токен? Можно же классы событий зашить в атрибут event соответствующего сообщению события

Код:
<user_left event="ServerDataUserLeft" user="Alex123" />
Сообщение будет показывать параметром какой класс события должен разбирать xml данные этого сообщения и какой объект события будет соответствовать данному сообщению.
Чем чреват такой подход?