<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alfredo Juarez &#187; Patrones de DiseÃ±o</title>
	<atom:link href="http://www.alfrek.net/blog/category/programacion/designpatterns/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alfrek.net/blog</link>
	<description>Web Design and Development</description>
	<lastBuildDate>Fri, 03 Dec 2010 20:06:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Symfony Components &#8211; Librerias PHP</title>
		<link>http://www.alfrek.net/blog/2009/09/symfony-components-librerias-php/</link>
		<comments>http://www.alfrek.net/blog/2009/09/symfony-components-librerias-php/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 00:14:04 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[librerias]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=1273</guid>
		<description><![CDATA[La gente detrás de Symfony, uno de los Frameworks más usados por la comunidad PHP ha publicado una serie de librerias independientes, que prometen ayudar con el proceso de desarrollo de aplicaciones Web, en su web reza la siguiente frase: The Symfony Components are standalone and reusable PHP classes. With no pre-requisite, except for PHP, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1274" title="symfony-components" src="http://www.alfrek.net/blog/wp-content/uploads/2009/09/symfony-components.jpg" alt="symfony-components" width="480" height="207" /></p>
<p>La gente detrás de Symfony, uno de los Frameworks más usados por la comunidad PHP ha publicado una serie de librerias independientes, que prometen ayudar con el proceso de desarrollo de aplicaciones Web, en su web reza la siguiente frase:</p>
<blockquote><p><a title="Symfony Components" href="http://components.symfony-project.org/" target="_blank">The Symfony Components</a> are standalone and reusable PHP classes. With no pre-requisite, except for PHP, you can install them today, and start using them right away. Currently, there are three components available at the moment.</p></blockquote>
<p>Los componentes publicados hasta el momento son:</p>
<p><strong><img class="alignnone size-full wp-image-1275" title="yaml" src="http://www.alfrek.net/blog/wp-content/uploads/2009/09/yaml.png" alt="yaml" width="278" height="236" /></strong></p>
<p><strong>YAML â€“ Una librerí­a que habla YAML</strong><br />
Symfony YAML es una libreria PHP que convierte cadenas YAML a arreglos PHP y viceversa.</p>
<p><img class="alignnone size-full wp-image-1276" title="event-dispatcher" src="http://www.alfrek.net/blog/wp-content/uploads/2009/09/event-dispatcher.png" alt="event-dispatcher" width="278" height="236" /></p>
<p><strong>Event Dispatcher â€“ Facilitando la comunicación entre clases</strong><br />
Symfony Event Dispatcher es una librerí­a que provee de una implementación ligera del patrón de diseño Observer.</p>
<p><img class="alignnone size-full wp-image-1277" title="dependency-injection" src="http://www.alfrek.net/blog/wp-content/uploads/2009/09/dependency-injection.png" alt="dependency-injection" width="278" height="236" /></p>
<p><strong>Dependency Injection â€“ Reinventando el manejo de clases</strong><br />
Symfony Dependency Injection es una librerí­a que provee un robusto contenedor de inyección de dependencias (Dependency Injection).</p>
<p>[Via <a href="http://www.webappers.com/2009/09/21/symfony-components-standalone-libraries-for-php/" target="_blank">WebAppers</a>]</p>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/mrss.php?id=1273'});">Start Slide Show with PicLens Lite <img src="http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2009/09/symfony-components-librerias-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Strategy</title>
		<link>http://www.alfrek.net/blog/2008/07/strategy/</link>
		<comments>http://www.alfrek.net/blog/2008/07/strategy/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 17:44:49 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[patrones de diseÃ±o]]></category>
		<category><![CDATA[strategy]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=508</guid>
		<description><![CDATA[El patrón de diseño Strategy es de los más cruciales que existen en el diseño orientado a objetos. Se trata de crear componentes conectables, reemplazables y reusables. Para explicar este patrón vamos a usar un ejemplo simple, que dicho sea de paso el uso de este patrón excede al ejemplo, pero es un buen intento [...]]]></description>
			<content:encoded><![CDATA[<p>El patrón de diseño Strategy es de los más cruciales que existen en el diseño orientado a objetos. Se trata de crear componentes conectables, reemplazables y reusables.<br />
Para explicar este patrón vamos a usar un ejemplo simple, que dicho sea de paso el uso de este patrón excede al ejemplo, pero es un buen intento para ayudar a comprenderlo.</p>
<h2>Hola Mundo usando Strategy</h2>

<a href="http://www.alfrek.net/blog/wp-content/gallery/prueba/strategy1.jpg" title="" class="thickbox" rel="singlepic15" >
	<img class="ngg-singlepic" src="http://www.alfrek.net/blog/index.php?callback=image&amp;pid=15&amp;width=320&amp;height=240&amp;mode=watermark" alt="" title="" />
</a>

<p>El diagrama de clases UML muestra que la clase padre implementa las funciones genéricas representando las etiquetas HTML de inicio y fin. La clase hija <strong>HolaMundo </strong>implementa las funciones especí­ficas, representado por el contenido del documento. De esta manera, para generar algo más que un saludo, digamos un anuncio, podemos agregar otra clase hija, la cuál genera contenido de un anuncio.</p>
<p>Podemos mover el método <strong>getContents( )</strong> a un objeto tipo <strong>Strategy</strong>, el cual utiliza <strong>HtmlDocument </strong>directamente en lugar de utilizar una subclase <strong>HtmlDocument</strong>. Tal y cómo lo muestra la siguiente figura.</p>

<a href="http://www.alfrek.net/blog/wp-content/gallery/prueba/strategy2.jpg" title="" class="thickbox" rel="singlepic14" >
	<img class="ngg-singlepic" src="http://www.alfrek.net/blog/index.php?callback=image&amp;pid=14&amp;width=320&amp;height=240&amp;mode=watermark" alt="Strategy" title="Strategy" />
</a>

<p>Cabe recalcar que estamos usando este ejemplo solo para entender los aspectos mecánicos de este patrón. HtmlContentStrategy podrí­a ser también una clase abstracta, pero lo hemos definido como una interfaz para dejar en claro que éste no necesita tener código.</p>
<p>Ahora veamos como pinta esto en código. La clase HtmlDocument todaví­a genera el inicio y comienzo del documento. Pero en lugar de obtener el contenido de un método que es aplicado en una subclase, éste lo obtiene del objeto <strong>Strategy</strong>.</p>
<pre><code class="javascript">Class HtmlDocument
{
	prí­vate $strategy;

	public <span class="function"><span class="keyword">function</span> <span class="title">__construct</span><span class="params">( $strategy )</span>
	{</span>
		$<span class="keyword">this</span>-&gt;strategy = $strategy;
	}

	public <span class="function"><span class="keyword">function</span> <span class="title">getHtml</span><span class="params">( )</span>
	{</span>
		<span class="keyword">return</span> â€œ&lt;html&gt;&lt;body&gt;â€.$<span class="keyword">this</span>-&gt;strategy-&gt;getContents( ).â€&lt;<span class="regexp">/body&gt;&lt;/</span>html&gt;â€;
	}
}
</code></pre>
<p>Queremos poder conectar diferentes objetos <strong>Strategy </strong>dentro del objeto <strong>HtmlDocument</strong>. Por lo que, el objeto <strong>HtmlDocument </strong>necesita una forma consistente de llamar al objeto <strong>Strategy</strong>. En otras palabras, éste necesita una interfaz consistente, la cuál es definidad por una interface.</p>
<pre><code class="php"><span class="keyword">interface</span> HtmlContentStrategy
{
	<span class="keyword">public</span> <span class="keyword">function</span> __construct( <span class="variable">$name</span> );
	<span class="keyword">public</span> <span class="keyword">function</span> getContents( );
}</code></pre>
<p>Ahora cualquier objeto <strong>HtmlDocument </strong>podrá usar cualquier objeto <strong>Strategy </strong>que implemente esta interfaz, ya que él solo requiere la habilidad para llamar al método <em><strong>getContents( )</strong></em>.</p>
<p>Pero, Â¿qué pasa con el constructor? La interfaz lo define, también. El objeto <strong>Strategy </strong>para generar el mensaje <em>â€œHola Mundoâ€</em> necesita la palabra <em>â€œMundoâ€</em> como argumento en el constructor. Pero, Â¿estamos seguros que otro objeto necesitará la misma palabra? Me temo que no; de hecho, pienso que necesitarán todo tipo de información para hacer su trabajo.</p>
<p>Para contrarestar este problema, solo eliminamos el constructor de la interface. Desde que <strong>HtmlDocument </strong>no instancia la clase <strong>Strategy</strong>, todos los objetos que implementan la interfaz pueden ser usados aún y cuando los constructores difieren. Así­ que la interfaz solo necesita el método <em><strong>getContents( )</strong></em>.</p>
<pre><code class="java"><span class="class"><span class="keyword">interface</span> <span class="title">HtmlContentStrategy</span>
{</span>
	<span class="keyword">public</span> function getContents( );
}</code></pre>
<p>Ahora podemos implementar el <em>â€œHola Mundoâ€</em> como una clase <strong>Strategy</strong>:</p>
<pre><code>class HolaMundoStrategy implements HtmlContentStrategy
{
	var $mensaje;

	public function __construct( $mensaje )
	{
		$this-&gt;mensaje = $mensaje;
	}

	public function getContents( )
	{
		return "Hola ".$this-&gt;mensaje . "!";
	}
}</code></pre>
<p>Lo que esta clase hace es trivial, pero el patrón es extremadamente usable en situaciones más complejas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/07/strategy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DAO: Data Access Object</title>
		<link>http://www.alfrek.net/blog/2008/07/dao-data-access-object/</link>
		<comments>http://www.alfrek.net/blog/2008/07/dao-data-access-object/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 00:05:38 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Arquitectura de Software]]></category>
		<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[dao]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patrones de diseÃ±o]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=460</guid>
		<description><![CDATA[La mayorí­a de aplicaciones requieren de interacción con una base de datos, ya sea del tipo relacional u orientada a objetos y en la mayorí­a de los casos la persistencia de datos está mezclada con la lógica del negocio. Lo que supone un problema a la hora de querer cambiar el motor de base de [...]]]></description>
			<content:encoded><![CDATA[<p>La mayorí­a de aplicaciones requieren de interacción con una base de datos, ya sea del tipo relacional u orientada a objetos y en la mayorí­a de los casos la persistencia de datos está mezclada con la lógica del negocio. Lo que supone un problema a la hora de querer cambiar el motor de base de datos.</p>
<p>Para entenderlo mejor formularemos un ejemplo de la vida real.</p>
<p>Imaginemos que estamos desarrollando una aplicación en la empresa donde trabajamos y estamos utilizando MySQL como motor de base de datos. Estamos en la fase de pruebas (ya a punto de publicar el producto final), y por alguna extraña razón a tu jefe se le ocurre que mejor deberí­amos usar Oracle, por que se lo recomendaron, piensa que es mejor, etc.</p>
<p>Que pasa si tenemos todo mezclado (lógica del negocio, métodos de acceso a datos, etc),  se convierte en una tremenda pesadilla.</p>
<p>Para nuestra suerte existe el patrón de diseño Data Access Object (DAO), que se encarga de encapsular la interacción de una aplicación con la base de datos.</p>
<p><strong>Â¿Como funciona?</strong></p>
<p>DAO encapsula el acceso a la base de datos, de esta manera cuando la capa de lógica de negocio necesite interactuar con la base de datos, ésta utilizará los métodos ofrecidos por DAO. Generalmente la clase de operaciones que ofrece la capa de datos se le conoce como CRUD (Create, Read, Update y Delete).</p>
<p>Cuando la capa de negocios necesite almacenar datos (por ejemplo) solo tendrá que hacer referencia al método correspondiente para insertar los datos de la clase DAO, de esta manera si en algún momento se llegara a optar por usar otro motor de búsquedas, la capa del negocio no se debe preocupar ya que sólo bastará con actualizar la capa de datos. Si hablamos de patrones algunos detectarán por aquí­ que se están delegando responsabilidades, una buena práctica de la orientación a objetos.</p>
<p>De hecho el método de persistencia no debe de interesarle a la capa de negocios, es decir, a él no le importa si los datos se guardan en una tabla MySQL, XML, Texto plano o se imprime, de esto se encarga DAO.</p>
<p>Por cada tabla de una base de datos relacional existirá un DAO. Esto consiste básicamente en una clase que es la que interactúa con la base de datos. Los métodos de esta clase dependen de la aplicación y de lo que queramos hacer. Pero generalmente se implementan las 4 funciones básicas (también conocidas como métodos CRUD).</p>
<p>Una vez entendido el funcionamiento de DAO, es conveniente explicar un nuevo término que nos será de ayuda para completar la implementación de nuestra capa de persistencia. Se trata de los DTO&#8217;s (Data Transfer IObject), los cuáles son utilizados por DAO para transportar los datos desde la base de datos hasta la capa de lógica de negocio o vice versa.</p>
<p>En pocas palabras un DTO es un objeto que en su interior tiene como atributos los mismos atributos del modelo, con sus correspondientes accessors (Setters y Getters).</p>

<a href="http://www.alfrek.net/blog/wp-content/gallery/prueba/dao-diagram.png" title="" class="thickbox" rel="singlepic2" >
	<img class="ngg-singlepic" src="http://www.alfrek.net/blog/index.php?callback=image&amp;pid=2&amp;width=320&amp;height=240&amp;mode=watermark" alt="dao-diagram.png" title="dao-diagram.png" />
</a>

<p>Diagrama DAO</p>
<p><strong>Ahora veamos un ejemplo</strong></p>
<p>Tenemos una aplicación que entre una de sus tantas funciones es controlar los datos de  clientes, y queremos usar DAO para el manejo de la persistencia de dicha aplicación.<br />
Primero que nada de define el modelo 8en este caso de clientes), para después partir con la codificación de los respectivos DTO y DAO.</p>
<p><strong>DTO</strong></p>
<pre><code class="php"><span class="keyword">Class</span> ClientesDTO
{
      <span class="keyword">private</span> <span class="variable">$id</span>;
      prí­vate <span class="variable">$nombre</span>;
      prí­vate <span class="variable">$direccion</span>;

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getID( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;id;
      }

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getName( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;nombre;
      }

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getAddress( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;direccion;
      }

      <span class="comment">/* Setters */</span>
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setID( <span class="variable">$id</span> )
      {
          <span class="variable">$this</span>-&gt;id = <span class="variable">$id</span>;
      }
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setName( <span class="variable">$name</span> )
      {
          <span class="variable">$this</span>-&gt;nombre = <span class="variable">$name</span>;
      }
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setAddress( <span class="variable">$address</span> )
      {
          <span class="variable">$this</span>-&gt;direccion = <span class="variable">$address</span>;
      }
}</code></pre>
<p><strong>DAO</strong></p>
<pre><code class="php"><span class="keyword">class</span> clientesDAO
{
     <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> create( <span class="variable">$dto</span> )
     {
          <span class="comment">/* implementación para la creación de un nuevo registro */</span>
     }

      <span class="comment">/* aqui van los demás metodos CRUD */</span>
}</code></pre>
<p>Por obvias razones no escribí­ todo el código necesario ya que este artí­culo es meramente informativo, pero pienso que es explicito el ejemplo para comprender el uso del patrón DAO.<br />
En la próxima entrega les mostraré un ejemplo más real, utilizando una mezcla de patrones, como el DAO, Singleton, Factory y Faí§ade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/07/dao-data-access-object/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Patrones de Arquitectura: Presentacion-Abstraccion-Control (PAC)</title>
		<link>http://www.alfrek.net/blog/2008/05/patrones-pac/</link>
		<comments>http://www.alfrek.net/blog/2008/05/patrones-pac/#comments</comments>
		<pubDate>Tue, 27 May 2008 18:42:11 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Arquitectura de Software]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[patrones de arquitectura]]></category>
		<category><![CDATA[patrones de diseÃ±o]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=370</guid>
		<description><![CDATA[Es un modelo de arquitectura de software, algo similar al modelo-vista-controlador (MVC). PAC se utiliza como una estructura jerárquica de los agentes, cada uno de ellos consistente en una trí­ada de presentación, la abstracción y el control de partes. Los agentes (o trí­adas) se comunican entre sí­ sólo a través del control de parte de [...]]]></description>
			<content:encoded><![CDATA[<p>Es un modelo de arquitectura de software, algo similar al modelo-vista-controlador (MVC). PAC se utiliza como una estructura jerárquica de los agentes, cada uno de ellos consistente en una trí­ada de presentación, la abstracción y el control de partes. Los agentes (o trí­adas) se comunican entre sí­ sólo a través del control de parte de cada trí­ada. También difiere de MVC en que dentro de cada trí­ada, se aí­sla por completo la presentación (vista en MVC) y la abstracción (modelo en MVC), Este ofrece separar el modelo y la vista, lo cuál, da al usuario una experiencia de usuario por los cortos periodos, de cómo la interfaz (presentación) puede ser mostrada antes que la abstracción este completamente inicializada.</p>
<p><strong>El control</strong> es algo similar al Controlador en la arquitectura MVC. Este procesa eventos externos y actualiza el modelo. También se actualiza directamente la parte de presentación. Sin embargo, es diferente del controlador en MVC en la medida en que éste pasa los cambios que se están realizando a su componente padre.</p>
<p><strong>La Abstracción</strong> contiene los datos, al igual que en MVC. Sin embargo, puede ser sólo una parte de la estructura de datos completa de la aplicación, y no desempeñar un papel activo en la notificación de cambios.</p>
<p><strong>La presentación</strong> es exactamente igual que la vista en el MVC. Muestra la información desde la abstracción.</p>
<h3>Como funciona</h3>
<p>El control padre crea los elementos de su hijo PAC, ya sea en el arranque del programa, o dinámicamente en tiempo de ejecución.<br />
Cuando el control de un PAC recibe un evento de usuario (1), este debe actualizar su presentación (2a) y/o su abstracción (2b). A continuación, se enví­a un evento de cambio a su padre (3). El padre actualiza sus hijos (pero no al nodo donde surgió el cambio) (5), por lo que todos actualizan su Presentación (6a) y/o abstracción (6b). Después que los nodos han sido actualizados, el padre se actualiza (7). Esto termina cuando todos los elementos PAC necesarios han sido actualizados.</p>
<p><a rel="attachment wp-att-371" href="http://www.alfrek.net/blog/2008/05/27/patrones-pac/modelo-del-patron-pac/"><img class="alignnone size-medium wp-image-371" title="modelo-del-patron-pac" src="http://www.alfrek.net/blog/wp-content/uploads/2008/05/modelo-del-patron-pac-300x125.png" border="0" alt="" hspace="5" vspace="5" width="340" /></a></p>
<p>Los hijos y padres pueden enviar eventos muy concretos para actualizar a sus vecinos. De esta forma, los elementos PAC podrán decidir la extensión del efecto del cambio. Pequeños cambios no tienen por qué ser propagados a través de toda la jerarquí­a.</p>
<h3>Problemas</h3>
<p>Las actuales herramientas de programación visual tienen algo relacionado con esta arquitectura, pero tienen todo tipo de peculiaridades y excepciones. Así­ que se puede tratar de reconocer la arquitectura en herramientas visuales, pero no son tan exactos. Además, la mayorí­a de herramientas dicen basarse en la arquitectura MVC, lo que tampoco es completamente cierto.</p>
<h3>Técnicas de implementación</h3>
<p>El Control es modelado por el patrón de diseño Mediator.<br />
La presentación es modelada por el patrón de diseño Strategy.</p>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/mrss.php?id=370'});">Start Slide Show with PicLens Lite <img src="http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/05/patrones-pac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desarrollo Web en Tres Capas</title>
		<link>http://www.alfrek.net/blog/2007/07/desarrollo-web-en-tres-capas/</link>
		<comments>http://www.alfrek.net/blog/2007/07/desarrollo-web-en-tres-capas/#comments</comments>
		<pubDate>Tue, 31 Jul 2007 03:31:13 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Arquitectura de Software]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[patrones de diseÃ±o]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/2007/07/30/desarrollo-web-en-tres-capas/</guid>
		<description><![CDATA[&#8220;Divide et vinces&#8221;: Divide y Vencerás Julio Cesar Muchos diseñadores web están acostumbrados a tener las etiquetas HTML, junto con las reglas CSS y las funciones JavaScript. Para los que se pregunten Â¿Y eso que tiene de malo? Este método no es de lo mas eficiente, ya que tienes una ensalada de lenguajes, esto hace [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;Divide et vinces&#8221;: Divide y Vencerás<br />
Julio Cesar</p></blockquote>
<p>Muchos diseñadores web están acostumbrados a tener las etiquetas HTML, junto con las reglas CSS y las funciones JavaScript. Para los que se pregunten Â¿Y eso que tiene de malo?  Este método no es de lo mas eficiente, ya que tienes una ensalada de lenguajes, esto hace que a la hora de querer hacer una revisión te pierdas entre tanto jeroglí­fico; por otro lado si tienes todo en un solo archivo la carga de la página se pone algo lenta ya que para el navegador es mas pesado cargar un archivo de muchos Bytes.<br />
Hace tiempo hable sobre los Patrones de diseño, pero olvide mencionar que también existen los Anti-Patrones los cuales describen las malas conductas que no debe de tomar nunca un desarrollador, a continuación les pongo la descripción del antipatron que les estoy mencionando.<br />
Código espagueti (spaghetti code): Construir sistemas cuya estructura es dificilmente comprensible, especialmente debido a la escasa utilización de estructuras de programación.</p>
<h2>Mantener todo separado</h2>
<p>Es sabido que las páginas Web se dividen 3 partes fundamentales:</p>
<ul>
<li>Contenido: Define el contenido del sitio.</li>
<li>Presentación: Define el aspecto visual del sitio.</li>
<li>Comportamiento: Define las acciones del sitio.</li>
</ul>
<p>Este método es llamado &#8220;Separación de preocupaciones&#8221;.</p>
<p><img style="width: 234px; height: 287px;" src="http://www.alfrek.net/blog/wp-content/uploads/2007/07/3-capas1.png" alt="" align="bottom" /></p>
<p>Entender e implementar éste método lleva tiempo y se necesita un poco de disciplina, pero una vez que hallan comprendido los beneficios de mantener todo separado tratarán de siempre hacerlo de esta manera.</p>
<p><span id="more-93"></span></p>
<h2>Tres Capas</h2>
<p>Mantener diferentes tipos de códigos lo mas separado posible es una buena práctica en cualquier tipo de programación. Facilita el re-uso de código, reduce notablemente la duplicidad de código y por último hace que la búsqueda y corrección de problemas sea mas fácil en un futuro.</p>
<p>Cuando esta practica es usada en la Web te permite conocer las diferentes maneras en las que los usuarios acceden a tu contenido, ya sea directamente, o víƒí­a algún lector de Feeds (Si ofreces RSS o algún otro formato parecido).</p>
<p>La clave para tener al mayor numero de visitantes es pensar en la Web como Tres capas.</p>
<p><img style="width: 372px; height: 248px;" src="http://www.alfrek.net/blog/wp-content/uploads/2007/07/3-capas2.png" alt="" align="bottom" /></p>
<p>A la hora de construir un sitio, debes de tomar en cuenta estas tres capas:<br />
1. Empezamos produciendo el contenido en formato HTML. Esta es la base de todo.<br />
2. Después agregamos un poco de CSS para darle un aspecto visual mas atractivo.<br />
3. Finalmente, podemos agregarle JavaScript, PHP, o cualquier otro lenguaje para darle dinamismo al Sitio.</p>
<p>Si mantenemos el código HTML, CSS y JavaScript separados, veremos que nuestro sitio será legible para tantos navegadores capaces de usar CSS y JavaScript o para los que no tienen estas caracterí­sticas.</p>
<h2>HTML para contenido</h2>
<p>Todo lo necesario para leer el contenido de una pagina Web radica en el HTML. Algo que se debe de tomar en cuenta siempre es el principio K.I.S.S (Keep It Simple, Stupid). â€œMantenlo simple, estupidoâ€œ por sus siglas en inglés.<br />
El mezclar aspectos presentacionales con contenido y/o aspectos de comportamiento son detalles que traen problemas futuros en el desarrollo del Sitio.</p>
<h3>Â¿HTML Semántico o No?</h3>
<p>El usar etiquetas HTML para aspectos visuales se le denomina HTML no-semántico, es decir, el uso de etiquetas</p>
<p>&lt;b&gt;, &lt;i&gt;, &lt;u&gt;, &lt;font&gt;, etc..<br />
&lt;p&gt;&lt;a xhref=&#8221;Desc.html&#8221;&gt;&lt;font color=&#8221;red&#8221;&gt;20% de descuento&lt;/font&gt;&lt;/a&gt; todo el mes&lt;/p&gt;</p>
<p>Esto puede tomar forma usando atributos CSS:</p>
<pre><code>&lt;p&gt; &lt;a zhref="Desc.html" class="red"&gt;20% de descuento&lt;/a&gt; todo el mes&lt;/p&gt;
</code></pre>
<p>Si piensas que esta forma está bien, este artí­culo te ayudará a tomar el camino del bien. Si en un futuro decides que quieres el link Amarillo, tendrí­as que cambiar el CSS, y cambiar la referencia a la clase, o dejar la referencia como &#8220;red&#8221;, cuando en realidad es amarillo.</p>
<p>Mas que mostrar información presentacional en tu código HTML, deberí­as enfocarte a qué es lo que realmente quieres, por ejemplo, en nuestro caso lo que deseamos es <strong>enfatizar</strong> el 20% de descuento,  entonces, Â¿Por qué no usar la etiqueta &lt; em &gt; &lt; / em &gt;? Que precisamente es para eso.</p>
<pre><code>&lt;p&gt;&lt;em&gt;&lt;a href="Desc.html"&gt;20% de descuento&lt;/a&gt;&lt;/em&gt; todo el mes&lt;/p&gt;
</code></pre>
<p>Â¿El link es una advertencia?, entonces usemos mejor una clase CSS que referencie a la llamada de advertencia.</p>
<pre><code>&lt;p&gt; &lt;a href="Desc.html" class="advert"&gt;20% de descuento&lt;/a&gt; todo el mes&lt;/p&gt;</code>&lt;</pre>
<p>Esta serí­a la mejor forma de usar HTML semántico, es decir, usar solamente las etiquetas para marcar contenido, no para especificar el aspecto visual del mismo.</p>
<p>Algunos diseñadores Web caen en el error de que las etiquetas &lt; h1 &gt; son presentacionales, y tratan de evitarlas usando HTML:</p>
<pre><code>&lt;p class="titulo"&gt; Desarrollo Web en Tres Capas &lt;/p&gt;</code></pre>
<p>El hecho de que una porción de texto sea un titular es parte del contenido, viéndose reflejado en en el HTML, esta etiqueta es correcta:</p>
<pre><code>&lt;h1&gt;Desarrollo Web en Tres Capas&lt;/h1&gt;</code></pre>
<p>Esta forma de usar el HTML, de manera que solo se utilicen etiquetas para el contenido es llamada por los estándares Web HTML semántico.</p>
<p>Utilizar el marcado semántico permite que tu código sean documentos totalmente legibles, personas que por cualquier razón, no pueden leer el sitio de manera normal, el HTML serí­a totalmente comprensible por las personas, ya que estás usando meramente etiquetas que describen los significados del contenido.</p>
<p>Lo mejor de todo, sin embargo, es que el marcado semántico te permite aplicar nuevos estilos (presentaciíƒón) o interactividad (comportamiento) sin tener que hacer muchos, o en algunos casos ningún cambio al código HTML.</p>
<h2>CSS para Presentación</h2>
<p>Obviamente los aspectos relacionados con la forma visual del contenido radica en las reglas CSS usadas para el Sitio.</p>
<p>Con todo el trabajo hecho, manteniendo el código HTML con marcado semántico, la tarea de darle vida al contenido, se convierte en algo mas sencillo, aplicando estilos CSS.</p>
<p>Como probablemente sabrás los estilos CSS,  pueden ser aplicados de 3 formas distintas:</p>
<ul>
<li>Estilos en linea</li>
<li>Estilos Embebidos</li>
<li>Estilos Externos</li>
</ul>
<p>Los estilos externos son realmente el camino a seguir a la hora de diseñar una Pagina Web, debido a que te permite compartir esos estilos a múltiples documentos, reduciendo la duplicidad de código, y la cantidad de descarga de código necesario por el navegador, y por último a la hora de querer cambiar el aspecto gráfico del Sitio, no necesitarás meter las manos al código HTML.</p>
<h2>JavaScript para comportamientos</h2>
<p>Al igual que CSS, es posible agregar JavaScript de diferentes formas, pero este documento pretende utilizar la forma externa de hacerlo.</p>
<pre><code>&lt;script type="text/javascript" src="script.js"&gt;&lt;/script&gt;</code>&lt;</pre>
<p>Escribir JavaScript que aumente la usabilidad sin estorbar al Sitio, sin la necesidad de bloquear aquellos usuarios que tengan deshabilitado el JavaScript en sus navegadores, y sin interferir en otros Scripts que deban ser aplicados a la página, es llamado JavaScript no obstrusivo.</p>
<p>Artí­Â­culo original | <a href="http://www.sitepoint.com/article/simply-javascript" target="_blank">SitePoint Simple Javascript</a><br />
Analizado, Sintetizado y traducido por Alfredo Juárez.<br />
Se trata de un pequeño resumen del primer capitulo de este libro, la verdad es que es totalmente recomendable si les interesa aprender JavaScript para añadirles dinamismo a los desarrollos Webs.</p>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/mrss.php?id=93'});">Start Slide Show with PicLens Lite <img src="http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2007/07/desarrollo-web-en-tres-capas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Patrones de Diseño (Design Patterns)</title>
		<link>http://www.alfrek.net/blog/2007/07/patrones-de-diseno-design-patterns/</link>
		<comments>http://www.alfrek.net/blog/2007/07/patrones-de-diseno-design-patterns/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 01:18:12 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Arquitectura de Software]]></category>
		<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[Otros]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[architect]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[patrones de diseÃ±o]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=10</guid>
		<description><![CDATA[&#8220;Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno y describe también el núcleo de la solución al problema, de forma que puede utilizarse un millón de veces sin tener que hacer dos veces lo mismo.&#8221; Christopher Alexander Como habí­a quedado esta es la segunda entrega sobre arquitectura de software, [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">&#8220;Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno y describe también el núcleo de la solución al problema, de forma que puede utilizarse un millón de veces sin tener que hacer dos veces lo mismo.&#8221;</span></p>
</blockquote>
<p class="MsoNormal" style="line-height: normal; text-align: right;"><em><span style="font-size: 12pt; font-family: " lang="ES">Christopher Alexander</span></em></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Como habí­a quedado esta es la segunda entrega sobre arquitectura de software, esta vez enfocada a los <strong>patrones de diseño</strong> los cuales describen un problema que ocurre en repetidas ocasiones en algún contexto determinado de desarrollo de software, y entregan una buena solución. Esto ayuda a diseñar correctamente en menos tiempo, evitando los errores que tan comúnmente se atribuyen a la etapa del diseño de software.</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Un patrón de diseño es una solución a un problema que ya ha sido resuelto satisfactoriamente en ocasiones anteriores y a su vez puede ser reusable (aplicable a diferentes problemas de diseño en distintas circunstancias).<br />
Siendo estos la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Al dí­a de hoy es recomendable realizar un análisis, diseño e implementación orientado a objetos, a no ser que exista una excepción requerida por las circunstancias de la aplicación o campo en el que nos movemos.<br />
Para la parte de análisis y diseño se recomienda utilizar el Lenguaje de Modelado Unificado (<strong>UML</strong> por sus siglas en ingles).</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES"><strong>Análisis Orientado a Objetos</strong></span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">En el análisis se estudia el dominio del problema para construir un modelo del mundo real utilizando objetos. Se investiga para hacer una descripción del problema y obtener todos los requerimientos necesarios.<br />
Se realiza una investigación del problema.<br />
Durante el Análisis, se enfatiza en encontrar y describir los objetos (o conceptos) en el dominio del problema.<em><br />
Por ejemplo: conceptos en un sistema de información para una librera incluyen Libros, Librerí­a.</em><br />
El í‰nfasis es en la investigación del problema y sus requisitos (mas que en una solución)<br />
Se resume en: Haz lo correcto (<strong>Do the Right Thing</strong>)<br />
<strong></strong></span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES"><strong>Diseño Orientado a Objetos</strong></span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Se enfatiza una solución conceptual que satisface los requerimientos.<br />
Se necesita definir objetos software y como colaboran entre si para satisfacer los requerimientos.<br />
<em>Por ejemplo: en el sistema de información de una librerí­a el objeto software â€œlibroâ€ deberí­a tener un atributo â€œtituloâ€ y un método obtenerCapitulo();</em><br />
Diseños son implementados en un lenguaje de programación<br />
Se resume en; Haz las cosas bien. (<strong>Do the thing right</strong>)<br />
A pesar del esfuerzo realizado en las etapas anteriores surgen problemas debido al uso inapropiado de la orientación a objetos, una muy común es el mal empleo de la encapsulación.</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Otro de los problemas fundamentales es el vacio que existe entre el análisis, diseño e implementación, que hace que el programador tenga la necesidad de tomar decisiones de diseño.</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Para solventar dichos problemas se produce un nuevo enfoque: el diseño con patrones. La idea fue propuesta inicialmente por el arquitecto Christopher Alexander, que aplica el concepto a la construcción de edificios en menos tiempo con la publicación de su libro <strong>&#8220;The TiÂ­meless Way of Building&#8221;</strong> en el año de 1979.<br />
No obstante, no fue hasta principios de los 90í¢â‚¬â„¢s cuando los patrones de diseño tuvieron gran í‰xito en el mundo de la informática a partir de la publicación del libro Design Patterns escrito por el GoF (Gang of Four) compuesto por Erich Gamma, Richard Helm, Ralph Johnson y John Vlisides, en el que recogí­an 23 patrones de diseño comunes.</span></p>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: " lang="ES">Objetivos de los patrones</span></strong><span style="font-size: 12pt; font-family: " lang="ES"><br />
Los patrones de diseño pretenden:</span></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Proporcionar catálogos de      elementos reusables en el diseño de sistemas de software.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Evitar la reiteración en la búsqueda      de soluciones a problemas ya conocidos y solucionados anteriormente.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Formalizar un vocabulario común      entre diseñadores.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Estandarizar el modo en que se      realiza el diseño.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Facilitar el aprendizaje de las      nuevas generaciones de diseñadores condensando el conocimiento ya      existente.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Sin embargo, no se pretende obligar      a utilizar los patrones de diseño siempre, solo en el caso de tener el      mismo problema o similar que soluciona el patrón, siempre teniendo en      cuenta que en un caso particular puede no ser aplicable. Abuzar o forzar      el uso de los patrones puede ser un error.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: " lang="ES">Clasificación de los patrones</span></strong><span style="font-size: 12pt; font-family: " lang="ES"><br />
Según la escala o nivel de abstracción:</span></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones arquitecturales:      Aquellos que expresan un esquema organizativo estructural fundamental para      sistemas software.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones de Diseño: Aquellos que      expresan esquemas para definir estructuras de diseño (o sus relaciones)      con las que construir sistemas software.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Idiomas: Patrones bajo nivel especí­ficos      para un lenguaje de programación o entorno concreto.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Según el propósito: Qué hace el patrón.</span></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones de Creación: para creación      de instancias.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones estructurales:      relaciones entre clases, combinación y formación de estructuras mayores.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones de Comportamiento: Interacción      y cooperación entre clases.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: ">Patrones Creacionales</span></strong></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Abstract Factory (Fábrica      abstracta): Permite trabajar con objetos de distintas familias de manera      que las familias no se mezclen entre sí­Â­ y haciendo transparente el tipo      de familia concreta que se esté usando.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Builder (Constructor virtual):      Abstrae el proceso de creación de un objeto complejo, centralizando dicho      proceso en un íšnico punto.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Factory Method (Método de fabricación):      Centraliza en una clase constructora la creación de objetos de un subtipo      de un tipo determinado, ocultando al usuario la casuí­stica para elegir el      subtipo que crear.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Prototype (Prototipo): Crea      nuevos objetos cloníndolos de una instancia ya existente.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Singleton (Instancia íšnica):      Garantiza la existencia de una íšnica instancia para una clase y la creación      de un mecanismo de acceso global a dicha instancia.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: ">Patrones Estructurales</span></strong></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Adapter (Adaptador): Adapta una      interfaz para que pueda ser utilizada por una clase que de otro modo no podrá      utilizarla.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Bridge (Puente): Desacopla una abstracción      de su implementación.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Composite (Objeto compuesto):      Permite tratar objetos compuestos como si de uno simple se tratase.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Decorator (Envoltorio): Añade      funcionalidad a una clase dinámicamente.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Facade (Fachada): Provee de una      interfaz unificada simple para acceder a una interfaz o grupo de      interfaces de un subsistema.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Flyweight (Peso ligero): Reduce      la redundancia cuando gran cantidad de objetos poseen idéntica información.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Proxy: Mantiene un representante      de un objeto.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: ">Patrones de Comportamiento</span></strong></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Chain of Responsibility (Cadena      de responsabilidad): Permite establecer la lí­nea que deben llevar los      mensajes para que los objetos realicen la tarea indicada.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Command (Orden): Encapsula una operación      en un objeto, permitiendo ejecutar dicha operación sin necesidad de      conocer el contenido de la misma.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Interpreter (Intérprete): Dado un      lenguaje, define una gramática para dicho lenguaje, así­Â­ como las      herramientas necesarias para interpretarlo.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Iterator (Iterador): Permite      realizar recorridos sobre objetos compuestos independientemente de la implementación      de estos.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Mediator (Mediador): Define un      objeto que coordine la comunicación entre objetos de distintas clases,      pero que funcionan como un conjunto.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Memento (Recuerdo): Permite      volver a estados anteriores del sistema.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Observer (Observador): Define una      dependencia de uno-a-muchos entre objetos, de forma que cuando un objeto      cambie de estado se notifique y actualicen automáticamente todos los      objetos que dependen de í‰l.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">State (Estado): Permite que un      objeto modifique su comportamiento cada vez que cambie su estado interno.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Strategy (Estrategia): Permite      disponer de varios métodos para resolver un problema y elegir cuál      utilizar en tiempo de ejecución.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Template Method (Método      plantilla): Define en una operación el esqueleto de un algoritmo,      delegando en las subclases algunos de sus pasos, esto permite que las      subclases redefinan ciertos pasos de un algoritmo sin cambiar su      estructura.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Visitor (Visitante): Permite      definir nuevas operaciones sobre una jerarquí­a de clases sin modificar las      clases sobre las que opera.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;">
<h1><span lang="ES-TRAD">Conclusiones</span></h1>
<p class="MsoNormal"><span lang="ES">La idea de los patrones ha adquirido gran popularidad. En el ámbito de la ingenierí­a de software; se están desarrollando muchos proyectos de investigación al respecto. No sólo se están aplicando en los llamados patrones de diseño, sino que la idea esta transportándose a otras actividades del desarrollo de software. </span></p>
<p class="MsoNormal"><span lang="ES">El concepto de patrón tiene carácter general y por consiguiente es aplicable a un sin número de situaciones de diferentes tipo, estilo, entorno, etc. En lo referente al software, la aplicación de los patrones esta siendo utilizada con éxito en muchos ámbitos de la ingenierí­a de software. En definitiva está mejorando las prácticas en el desarrollo de sistemas de información.</span></p>
<p class="MsoNormal"><span lang="ES">Donde exista la posibilidad de aplicación del criterio profesional experimentado, a un problema recurrente, la idea de patrones de Alexander podrá usarse para reutilizar y transmitir dichas experiencias a profesionales menos experimentados. </span></p>
<p class="MsoNormal"><span lang="ES">Por lo tanto podemos resumir un patrón con los siguientes puntos:</span></p>
<ul style="margin-top: 0cm;" type="disc">
<li class="MsoNormal"><span lang="ES">Un Patrón de      Diseño, es un conjunto de información que describe una solución recurrente      a un problema de diseño no trivial. </span></li>
<li class="MsoNormal"><span lang="ES">La efectividad de      esta solución ha debido ser probada muchas veces por profesionales      expertos dentro de un contexto determinado en situaciones anteriores. </span></li>
<li class="MsoNormal"><span lang="ES">Esta solución debe      ser reutilizable, para problemas de diseño similares en distintas      circunstancias. </span></li>
<li class="MsoNormal" style="margin-bottom: 0.0001pt;"><span lang="ES">Esta descripción de un patrón debe ser lo suficientemente      explí­cita para que pueda ser transmitida a profesionales no      expertos&#8221;.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 18pt; font-family: ">Bibliografí­a</span></strong></p>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: ">Design Patterns. Elements of Reusable Object-Oriented Software</span></strong><span style="font-size: 12pt; font-family: "> &#8211; Gamma, Helm, Johnson, Vlissides &#8211; Addison Wesley<br />
<strong>UML y Patrones. </strong></span><strong><span style="font-size: 12pt; font-family: " lang="ES">Introducción al análisis y diseño orientado a objetos</span></strong><span style="font-size: 12pt; font-family: " lang="ES"> &#8211; Larman &#8211; Prentice Hall<br />
<strong>Patrones de diseño</strong> &#8211; Wikipedia</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2007/07/patrones-de-diseno-design-patterns/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

