Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cochabamba – Bolivia
2019
Agradecimientos
Agradezco a Dios por cuidarme y guiar mi camino.
A mi mamá María Isabel Luizaga Sahonero, a
Juan Ferrufino Vidal y a mis hermanos, por el
amor y cuidado siempre brindado.
A Tania Andrea Valero Malele por su apoyo
incondicional.
A Digital Harbor, por darme la oportunidad de
crecer más profesionalmente.
INDICE DE CONTENIDO
RESUMEN ................................................................................................................................... 1
INTRODUCCIÓN ......................................................................................................................... 3
1 GENERALIDADES ................................................................................................................ 6
2 METODOLOGÍA ................................................................................................................... 8
7 CONCLUSIONES................................................................................................................. 47
8 BIBLIOGRAFÍA .................................................................................................................. 48
TABLA DE CUADROS, GRAFICOS Y FIGURAS
Resumen
Los patrones de diseño nacieron a medida que los sistemas evolucionaban, donde los
programadores con el paso del tiempo mejoraban sus implementaciones y soluciones a problemas
recurrentes. De esta forma esas soluciones se convirtieron en un estándar, dando así un nuevo
En la actualidad las últimas tecnologías y frameworks, tales como Angular, Spring, entre otras, ya
vienen con arquitecturas bastante complejas y robustas, donde para lograr esa robustez lo hacen
Esto no quiere decir que al usar frameworks tenemos todo solucionado, por el contrario, debemos
tener conocimiento de los patrones más fundamentales para aplicarnos a nuestras soluciones,
permitiendo así que nuestro código sea de calidad siendo extensible y reusable.
1
Aplicación Práctica de Patrones de Diseño en Front-End
2
Aplicación Práctica de Patrones de Diseño en Front-End
Introducción
con diferentes escenarios con múltiples funcionalidades o características que se deben analizar e
implementar, aquí suelen surgir los problemas, las dudas, de cómo afrontarlos de manera adecuada,
donde la solución que elijamos sea flexible, elegante y reusable. Puede que estos escenarios puedan
ser resueltos de manera trivial como también requieran una solución más elaborada, con una
estructura bien definida para poder ser resueltos de manera eficiente. Diseñar software orientado a
A medida que implementamos funcionalidades nos damos cuenta que existen escenarios con un
problema en común, pero en diferentes contextos, donde en estos casos se pueden reutilizar
soluciones pasadas.
Por tanto, nos encontraremos con patrones recurrentes de clases y comunicaciones entre objetos
diseño y hacen que los diseños orientados a objetos sean más flexibles, elegantes y reutilizables.
(Gamma, Helm, Johnson, & Vlissides, Patrones de diseño. Elementos de software orientado a
Existen una gran variedad de patrones de diseño, donde nos brindan soluciones a diferentes tipos
de problemas, en este trabajo nos centraremos en los más útiles y usados, aplicándolos en lado de
front-end1 con Angular. “Angular es considerada como una plataforma y un framework para el
1
Término que se refieren a la capa de presentación
3
Aplicación Práctica de Patrones de Diseño en Front-End
2018)
De esta forma se conocerá los patrones de diseño más útiles y usados, teniendo una idea más clara
de cómo y en qué momento aplicarlos cuando se está desarrollando una aplicación con un lenguaje
de POO2 tal como es TypeScript 3, definiéndonos así una estructura robusta y elegante al momento
2
Acrónimo de programación orientada a objetos
3
Lenguaje de programación de código abierto desarrollador por Microsoft
4
Aplicación Práctica de Patrones de Diseño en Front-End
5
Aplicación Práctica de Patrones de Diseño en Front-End
1 GENERALIDADES
A medida que desarrollamos software, este con el tiempo va creciendo y nos topamos con una
implementarla, de estas funcionalidades puede que algunas se logren implementar de manera trivial
Uno de los problemas cuando se habla de arquitectura para sistemas de software es que la
Cuando se desarrolla software con algún framework4 como ser Angular, este ya nos brinda una
arquitectura robusta para iniciar, pero con el paso del tiempo y el crecimiento del software se
necesita definir otro tipo de estructuras para que nuestras soluciones sean más reusables y
escalables.
4
Estructura de software definido, sobre la cual otro proyecto de software puede ser organizado y
desarrollado
6
Aplicación Práctica de Patrones de Diseño en Front-End
lenguaje HTML y TypeScript. Angular tiene como lenguaje base a TypeScript, que es un lenguaje
de POO, esto nos permitirá el uso de ciertas características o conceptos tales como herencia de
clases, polimorfismo 5, entre otros, dándonos así la posibilidad de implementar soluciones más
elegantes y reusables.
Existen una gran variedad de patrones de diseño según su propósito y ámbito, “Cada patrón de
hacerlo teniendo en cuenta otras restricciones de diseño, así como las consecuencias y las ventajas
e inconvenientes de su uso (Gamma, Helm, Johnson, & Vlissides, Patrones de diseño. Elementos
El uso de diferentes patrones de diseño en el desarrollo de tu aplicación Angular, harán que, definas
5
Propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tipos distintos
7
Aplicación Práctica de Patrones de Diseño en Front-End
2 METODOLOGÍA
trabajo:
8
Aplicación Práctica de Patrones de Diseño en Front-End
3 PATRONES DE DISEÑO
Antes de iniciar con cualquier implementación debemos tener claro que es un patrón de diseño,
Un patrón de diseño nomina, abstrae e identifica los aspectos clave de una estructura de diseño
común, lo que les hace útiles para crear un diseño orientado a objetos reutilizables. El patrón de
diseño identifica las clases e instancias participantes sus roles y colaboraciones, y la distribución
Las principales utilidades que nos brindan los patrones de diseño son:
mayor parte del problema de forma directa donde las modificaciones para el contexto en el
9
Aplicación Práctica de Patrones de Diseño en Front-End
implementación.
Dado que existe muchos patrones de diseño, es necesario un modo de organizarlos y separarlos por
su propósito y su ámbito.
10
Aplicación Práctica de Patrones de Diseño en Front-End
Propósito
1. Propósito, donde refleja que hace el patrón. Pueden tener un propósito de creación,
estructural o de comportamiento.
Como pudimos ver en la Tabla 1, existe una gran cantidad de patrones de diseño que están
clasificados en diferentes grupos, veremos la aplicación de los más importantes usando Angular.
11
Aplicación Práctica de Patrones de Diseño en Front-End
Este tipo de patrones permiten que nuestro sistema sea independiente de cómo se crean, componen
o representan sus objetos. Donde para la creación de clases se hace uso de la herencia para cambiar
la clase de la instancia a crear, mientras que un patrón de creación de objetos delega la creación de
A medida que nuestros sistemas crecen estos patrones nos ayuda a que sean más dependientes de
comportamientos posibles.
Por tanto, la creación de objetos es algo más que instanciar una clase.
El propósito principal de este patrón de diseño es el de permitir a subclases decidan que clase
instanciar a través de una interfaz6, “Permite que una clase delegue en sus subclases la creación de
Proporcionado así enganches para las subclases y conectando jerarquías de clases paralelas.
6
Conjunto de métodos abstractos y de constantes cuya funcionalidad es la de determinar el
comportamiento de una clase
12
Aplicación Práctica de Patrones de Diseño en Front-End
Se tiene diferentes tipos de archivos, donde los cuales se pueden reproducir, tal reproducción es
Donde:
13
Aplicación Práctica de Patrones de Diseño en Front-End
Archivo.ts
ArchivoAudio.ts
constructor() {
}
ArchivoVideo.ts
constructor() {
}
14
Aplicación Práctica de Patrones de Diseño en Front-End
CreadorDeArchivos.ts
constructor() {
}
switch (tipoArchivo) {
case(TipoDeArchivos.AUDIO):
archivo = new ArchivoAudio();
break;
case(TipoDeArchivos.VIDEO):
archivo = new ArchivoAudio();
break;
}
}
De esta forma aplicamos el Factory method en la clase CreadorDeArchivos, donde según el tipo le
podremos pedir que nos cree los diferentes archivos que existen o que pueden surgir más delante,
15
Aplicación Práctica de Patrones de Diseño en Front-End
Se requiere construir diferentes tipos de autos, por ahora se tiene dos tipos, el básico y el full, donde
la diferencia principal está en los componentes o partes que lleva cada uno.
16
Aplicación Práctica de Patrones de Diseño en Front-End
Donde:
17
Aplicación Práctica de Patrones de Diseño en Front-End
Director.service.ts
@Injectable()
export class Director {
constructor() {
}
constructor.construirMotor();
constructor.construirCarroceria();
constructor.construirAireAcondic();
}
ConstructorDeAutos.ts
constructor() {
}
18
Aplicación Práctica de Patrones de Diseño en Front-End
ConstructorAutosBasicos.ts
export class ConstructorAutosBasicos extends ConstructorDeAutos {
constructor() {
super();
}
construirMotor(): void {
this.auto.motor = 'Motor de potencia mínima';
}
construirCarroceria(): void {
this.auto.carroceria = 'Carroceria con protección minima';
}
construirAireAcondic(): void {
this.auto.aireAcondic = false;
}
19
Aplicación Práctica de Patrones de Diseño en Front-End
ConstructorAutosEquipados.ts
export class ConstructorAutosEquipados extends ConstructorDeAutos {
constructor() {
super();
}
construirMotor(): void {
this.auto.motor = 'Motor de potencia full;
}
construirCarroceria(): void {
this.auto.carroceria = 'Carroceria con protección full;
}
construirAireAcondic(): void {
this.auto.aireAcondic = true;
}
}
Código Fuente 8: Clase Constructor Autos Equipados
20
Aplicación Práctica de Patrones de Diseño en Front-End
Auto.ts
constructor() {
this._motor = '';
this._carroceria = '';
this._aireAcondic = false;
}
21
Aplicación Práctica de Patrones de Diseño en Front-End
De esta forma podemos inyectar el servicio 7 Director y crear nuestros diferentes Objetos auto paso
a paso, esto nos da un control más fino sobre el proceso de construcción y, por tanto, sobre la
7
Un Servicio en Angular es el mecanismo para compartir funcionalidad entre componentes
22
Aplicación Práctica de Patrones de Diseño en Front-End
“Los patrones estructurales se ocupan de cómo se combinan las clases y los objetos para formar
estructuras más grandes”. (Gamma, Helm, Johnson, & Vlissides, 2003, p. 130) Especifican la
Se trata de conseguir que cambios en los requisitos de la aplicación no ocasionen cambios en las
Las relaciones de uso están determinadas por las interfaces que son soportan los objetos.
Desacopla una abstracción de su implementación de manera que las dos puedan evolucionar
Usado para evitar una vinculación permanente entre una abstracción y su implementación además
permite compartir una implementación entre múltiples objetos, sin que lo noten los clientes.
23
Aplicación Práctica de Patrones de Diseño en Front-End
Supongamos que tenemos una aplicación que se comunique con un sistema externo, dicha
comunicación deberá ser encriptada mediante diversos algoritmos, sin embargo, la implementación
concreta del algoritmo de encriptación puede cambiar y es necesario crear un adaptador que nos
permita desacoplar la implementación concreta con la forma de utilizarlo, por lo cual, utilizaremos
un adaptador que encapsule la lógica y nos exponga una interface común entre todos los métodos
de encriptación.
24
Aplicación Práctica de Patrones de Diseño en Front-End
Donde:
25
Aplicación Práctica de Patrones de Diseño en Front-End
Encriptador .ts
export abstract class Encriptador {
}
Código Fuente 10: Clase Encriptador
EncriptadorImpl.ts
export interface EncriptadorImpl {
encriptarValor(valor: string): string;
desencriptarValor(valor: string): string;
}
Código Fuente 11: Clase EncriptadorImpl
26
Aplicación Práctica de Patrones de Diseño en Front-End
EncriptadorAES.ts
export class EncriptadorAES implements EncriptadorImpl {
private _key: string;
constructor(key: string) {
this._key = key;
}
27
Aplicación Práctica de Patrones de Diseño en Front-End
EncriptadorDES.ts
export class EncriptadorDES implements EncriptadorImpl {
constructor() {
}
EncriptadorDeContrasenias.service.ts
@Injectable()
export class EncriptadorDeContrasenias extends Encriptador {
constructor(key: string) {
super(new EncriptadorAES('KEY'));
}
}
Código Fuente 14: Clase EncriptadorDeContrasenias
De esta forma logramos un bajo acoplamiento, esto significa que cuando sea necesario cambiar el
28
Aplicación Práctica de Patrones de Diseño en Front-End
proporcionando una interface de alto nivel, la cual se encarga de realizar la comunicación con todos
los subsistemas necesarios. Es una buena estrategia cuando requerimos interactuar con varios
subsistemas para realizar una operación concreta ya que se necesita tener el conocimiento técnico
y funcional para saber qué operaciones de cada subsistema tenemos que ejecutar y en qué orden,
lo que puede resultar muy complicado cuando los sistemas empiezan a crecer demasiado.
Aplicaremos este patrón a un problema bastante común de la vida real: sacar dinero de un cajero.
Para retirar efectivo de un cajero automático, se requiere una gran cantidad de funciones y
29
Aplicación Práctica de Patrones de Diseño en Front-End
Para esto veremos una implementación base de las clases o subsistemas con los cuales debemos
Donde:
30
Aplicación Práctica de Patrones de Diseño en Front-End
Autenticador.service.ts
@Injectable()
export class Autenticador {
/* implementación... */
31
Aplicación Práctica de Patrones de Diseño en Front-End
Cajero.service.ts
@Injectable()
export class Cajero {
/* implementación... */
}
Código Fuente 16: Servicio Cajero
32
Aplicación Práctica de Patrones de Diseño en Front-End
Cuenta.ts
export class Cuenta {
/* implementación... */
}
Código Fuente 17: Clase Cuenta
33
Aplicación Práctica de Patrones de Diseño en Front-End
FachadaCajero.ts
export class FachadaCajero {
private _cuenta: Cuenta;
if (tarjeta_correcta) {
const clave: string = this._autenticador.introducirClave();
if (clave_correcta) {
this._cuenta = this._autenticador.obtenerCuenta();
return;
}
}
this._autenticador.fallar();
}
if (tiene_dinero) {
const hay_saldo_suficiente: boolean = this._cuenta.comprobarSaldoDisponible()
>= cantidad;
if (hay_saldo_suficiente) {
this._cuenta.bloquearCuenta();
this._cuenta.retirarSaldo(cantidad);
this._cuenta.actualizarCuenta();
this._cuenta.desbloquearCuenta();
this._cajero.expedirDinero();
this._cajero.imprimirTicket();
} else {
this._cuenta.alFallar();
}
}
}
}
34
Aplicación Práctica de Patrones de Diseño en Front-End
De esta manera, se consiguió que para que un cliente use el cajero, no tenga que realizar todas las
operaciones de sus subsistemas o clases. En lugar de ello proporcionamos una interfaz mucho más
35
Aplicación Práctica de Patrones de Diseño en Front-End
“Los patrones de comportamiento tienen que ver con algoritmos y con la asignación de
responsabilidades a objetos.” (Gamma, Helm, Johnson, & Vlissides, 2003, p. 204) Son algoritmos
Permite la distribución del comportamiento entre varias clases mediante herencia y mediante
El patrón de diseño Command nos permite ejecutar operaciones sin conocer los detalles de la
implementación de la misma. Las operaciones son conocidas como comandos y cada operación es
implementada como una clase independiente que realiza una acción muy concreta, para lo cual,
Una de las ventajas que ofrece este patrón es la de poder crear cuántos comandos requerimos y
36
Aplicación Práctica de Patrones de Diseño en Front-End
Veamos un simple ejemplo de uso del patrón Command. Para ello vamos a plantear el escenario
37
Aplicación Práctica de Patrones de Diseño en Front-End
Donde:
Command.ts
export interface Command {
ejecutar(): void;
}
Código Fuente 19: Interface Command
38
Aplicación Práctica de Patrones de Diseño en Front-End
Luces.ts
export class Luces {
constructor() {
}
try {
console.log('Conexión al sistema de iluminación establecida.');
return true;
} catch (e) {
console.log('No se ha podido establecer la conexión al sistema de
iluminación. ERROR:n' + e.getMessage());
return false;
}
}
try {
console.log('Se ha desconectado del sistema de iluminación.');
return true;
} catch (e) {
console.log('No se ha podido desconectar del sistema de iluminación.
ERROR:n' + e.getMessage());
return false;
}
}
try {
console.log('Sistema de iluminación encendido.');
return true;
} catch (e) {
console.log('No se ha podido encender el sistema de iluminación.
ERROR:n' + e.getMessage());
return false;
}
}
try {
console.log('Sistema de iluminación apagado.');
return true;
} catch (e) {
console.log('No se ha podido apagar el sistema de iluminación.
ERROR:n' + e.getMessage()); 39
return false;
}
}
}
Aplicación Práctica de Patrones de Diseño en Front-End
try {
console.log('Sistema de iluminación apagado.');
return true;
} catch (e) {
console.log('No se ha podido apagar el sistema de iluminación.
ERROR:n' + e.getMessage());
return false;
}
}
EncenderLuces.ts
export class EncenderLuces implements Command {
private _luces: Luces;
public constructor() {
this._luces = new Luces();
}
40
Aplicación Práctica de Patrones de Diseño en Front-End
ApagarLuces.ts
export class ApagarLuces implements Command {
private _luces: Luces;
public constructor() {
this._luces = new Luces();
}
Invocador.ts
export class Invocador {
private _orden: Command;
41
Aplicación Práctica de Patrones de Diseño en Front-End
Cliente.ts
export class Cliente {
private _command: Command;
private _invoker: Invocador;
constructor() {
}
}
Código Fuente 24: Clase Cliente
De esta forma tenemos escalabilidad en cuanto a nuestro conjunto de órdenes las cuales pueden
crecer con el tiempo, las cuales podemos ejecutar y cambiar en tiempo de ejecución de nuestra
aplicación.
42
Aplicación Práctica de Patrones de Diseño en Front-End
implementar algoritmos que realizan los mismos pasos para llegar a una solución. Esto se logra
creado un método para cada paso del algoritmo a implementar, de los cuales algunos serán
implementados y otros permanecerán abstractos hasta su ejecución por parte de las subclases.
Queremos obtener el precio de diferentes productos según sean nacionales o importados, ya que
43
Aplicación Práctica de Patrones de Diseño en Front-End
Figura 12: : Diagrama del ejemplo de aplicación del patrón Template Method
Donde:
44
Aplicación Práctica de Patrones de Diseño en Front-End
Producto.ts
export abstract class Producto {
private _precioBase: number;
constructor(precioBase) {
this._precioBase = precioBase;
}
}
Código Fuente 25: Clase Producto
45
Aplicación Práctica de Patrones de Diseño en Front-End
ProductoNacional.ts
export class ProductoNacional extends Producto {
private readonly IMPUESTO: number = 5;
constructor(precioBase: number) {
super(precioBase);
}
}
Código Fuente 26: Clase ProductoNacional
ProductoImportado.ts
export class ProductoImportado extends Producto {
private readonly IMPUESTO: number = 10;
constructor(precioBase: number) {
super(precioBase);
}
}
Código Fuente 27: Clase ProductoImportado
De esta forma podemos reusar código y solo sobrescribir o definir el comportamiento específico
46
Aplicación Práctica de Patrones de Diseño en Front-End
7 CONCLUSIONES
Luego de aplicar los patrones de diseño vistos en este trabajo a nuestros proyectos con Angular u
otra tecnología, lo más probable es que su estructura sea elegante, extensible y reusable, donde el
código sea más entendible, donde este habla por sí solo, ya que nos basamos en patrones ya
Además de esa arquitectura bien diseñada, el vocabulario de patrones para poder comunicarnos
Los patrones de diseño son indispensables para que el producto que se desarrolle sea robusto y fácil
de mantener, estandarizando el código y teniendo así una larga vida donde pueda ser mejorado o
47
Aplicación Práctica de Patrones de Diseño en Front-End
8 BIBLIOGRAFÍA
48