« Banco de sonidos del Ministerio de EducaciÛn | Inicio | Curso de AS »

Un ejemplo del patrÛn Proxy

Quiero salvar una lista de usuarios registrados, pero no sÈ exactamente donde. La cuestiÛn es que dependiendo del valor de un checkbox ( en el que el usuario elige si est· conectado a internet o no ), debo mandar los datos a servidor ( en formato XML ) o guardarlos en disco en un Shared Object

°Esta es una misiÛn para el patrÛn Proxy. ø Por quÈ?. Porque quiero aislar el proceso de guardar los datos del resto del programa, simplemente quiero decir, "eh, guardame esto" y olvidarme de cÛmo o dÛnde se guarda.

Eso es lo que hace este patrÛn. El proxy guarda una referencia a un objeto, que es quien realmente se encargar· de ejecutar la acciÛn. Pero es el proxy el que crea ese objeto, por lo que puede crear una instancia de una u otra clase dependiendo de ciertas condiciones en tiempo de ejecuciÛn

Por tanto, todas las clases que puedan ser instanciadas por el proxy, deben implementar el mismo interfaz. Y dependiendo del tipo de proxy, puede ser una buena idea que incluso Èl mismo implemente ese interfaz, para que se pueda eliminar si es necesario.

Basta ya de literatura. Primero, el interface:

interface ISaveable { public function saveUserList( theList: Array ); }

Sencillo, øno?. Queremos salvar una lista de usuarios, por lo tanto hemos definido un mÈtodo saveUserList

Ahora, la clase que se encarga de enviar los datos a servidor

class myXML extends XML implements ISaveable { private var userArray: Array; function myXML( ) { this.userArray = new Array( ); } function sendData( ) { //this.sendAndLoad( ); } public function saveUserList( theList: Array ) { trace( "The XML is handling the data" ); this.userArray = theList; //create the XML nodes, and send to server } }

Nada complicado. Simplemente un mÈtodo p˙blico que recibe el array de usuarios, que se utilizar· para crear el XML que se enviar· a servidor

Bien, ahora la clase que guarda los datos en disco:

class mySO implements ISaveable { private var theSO: SharedObject; private var userArray: Array; function mySO( ) { this.userArray = new Array( ); } public function saveUserList( theList: Array ) { trace( "The Shared Object handles the data" ); this.userArray = theList; } }

Esta clae implementa ISaveable, y al recibir los datos, intentar· guardarlos en un Shared Object

Ahora la parte compleja. En este ejemplo, he representado el valor del checkbox ( el estado de la conexiÛn ) utilizando una variable en _root. Pero para obtener el valo9r de esa variable, voy a utilizar un singleton. Simplemente, porque me parece una manera mejor, en este caso, que hacer una referencia directa a _root desde el proxy

class singleton { private static var inst:singleton; private function singleton() {} public static function get instance():singleton { if (inst == null) inst = new singleton(); return inst; } public function isConnected( ): Boolean { return _root.connected; } }

Y, por fin, el proxy

class saveUserListProxy implements ISaveable { private var realClass: ISaveable; function saveUserListProxy( ) { var config: singleton = singleton.instance; var conFlag: Boolean = config.isConnected( ); if ( conFlag ) { this.realClass = ISaveable( new myXML( ) ); } else { this.realClass = ISaveable( new mySO( ) ); } } public function saveUserList( theList: Array ) { this.realClass.saveUserList( theList ); } }

Y finalmente, en este ejemplo, en la lÌnea de tiempo principal tendrÌamos:

var connected: Boolean = false; var theUserList: Array = new Array( ); theUserList.push( { id: 0, name: "Cesar" } ); theUserList.push( { id: 1, name: "Javier" } ); var myProxy: saveUserListProxy = new saveUserListProxy( ); myProxy.saveUserList( theUserList );

Podeis probar que todo funciona cambiando el valor de la variable "connected"

Y eso es todo. Son casi las dos de la maÒana de otra jornada laboral de casi 11 horas. Creo que ya va siendo hora de irse a la cama.....

TrackBack

URL del Trackback para esta entrada:
http://ctarda.dreamhosters.com/cgi-bin/mt-tb.cgi/642

Comentarios

Hola CÈsar,

Este post lo tenÌa guardado en "posts por mirar" ;).
...y por fin lo he podido probar y "degustar"...muy bueno, lo he disfrutado :)

Ahora bien, que ocurre con los Flasheros de habla hispana?, es que no les interesan esos temas, a mi me parece un ejemplo altamente interesante y reutilizable en proyectos propios. øcomo es que en la versiÛn inglesa de este post hay ahora mismo 7 comentarios, y en esta 0 (pronto 1 ;)?

Esto le harÌa sentir a cualquiera que estamos solos en este tipo de intereses...øno?

Mil gracia y saludos.

C.

Gracias, Carlos, me vas a subir los colores ;)

Es cierto que casi nunca hay comentarios en estos posts, pero yo siempre lo he achacado, citando a Mark Twain, a que "lo m·s difÌcil en esta vida es construir un buen ejemplo". De hecho, en parte es por eso tambiÈn por lo que en el post inglÈs hay siete comentarios....

Gracias por tus ·nimos.