1. INGENIERIA INFORMATICA
UNIVERSIDAD NACIONAL DE TRUJILLO
FACULTAD DE CIENCIAS FISICAS Y MATEMATICAS
ESCUELA ACADEMICO PROFESIONAL DE INFORMÁTICA
PROYECTO DEL CURSO DE: Tópicos Especiales en Ciencia de la Computación III
“DECORATOR”
MIEMBROS DEL EQUIPO:
Aguilar Bernave Roberto Jesus
Ruiz Espil Martín
TRUJILLO
2. INGENIERIA INFORMATICA
Índice de Contenido
DEDICATORIAS………………………………………………………………………4
INTRODUCCION ........................................................................................................ 5
MARCO TEORICO: ........................................................Error! Bookmark not defined.
Decotator……………………………………………………………………………………..7
Herencia……………………………………………………………………………………...8
Abstraccion…………………………………………………………………………………..9
CAPITULO I ................................................................................................................ 10
CONCLUSION .............................................................................................................. 11
BIBLIOGRAFIA ........................................................................................................... 12
3. INGENIERIA INFORMATICA
A Dios todo poderoso, por haber llegado hasta este momento
tan importante de mi formación profesional.
A mis padres, por ser los pilares más importantes y por
demostrarme siempre su cariño y apoyo incondicional.
A mis hermanos por estar siempre presentes, acompañándome
en los momentos más difíciles. A mi bebe Carlos Daniel quien ha
sido y es una mi motivación, inspiración y felicidad.
A mis profesores, gracias por su tiempo, por su apoyo así
como por la sabiduría que me transmitieron en el
desarrollo universitario.
AGUILAR BERNABE, ROBERTO JESUS
4. INGENIERIA INFORMATICA
A Dios por mostrarme día a día que con humildad,
paciencia y sabiduría todo es posible.
A mis padres y hermanos quienes con su amor,
apoyo y comprensión incondicional estuvieron siempre a
lo largo de mi vida estudiantil.
A mis amigos que siempre tuvieron una palabra
de aliento en los momentos difíciles y que han
sido incentivos de mi vida.
MARTIN FRANCISO RUIZ ESPIl
5. INGENIERIA INFORMATICA
INTRODUCCION
El patrón decorator permite añadir responsabilidades a objetos concretos de
forma dinámica. Los decoradores ofrecen una alternativa más flexible que la
herencia para extender las funcionalidades.
Dado que este patrón decora un objeto y le agrega funcionalidad, a veces
tenemos la necesidad de crear una clase base, que hace ciertas cosas, y
queremos extender la funcionalidad de esa clase base, pues fácil, usamos la
herencia. Pero después queremos agregarle otra funcionalidad distinta. La
solución seria heredar de nuevo. Y podemos seguir así una y otra vez. Al final
tendremos una clase monstruo que hace muchas cosas de las cuales la mayoría
de las veces solo ocuparemos una pocas.
Una forma de resolverlo es con herencia múltiple, es decir creando una clase
que herede de varias clases, solo las que tengan la funcionalidad que nos
interesa. Pero la herencia múltiple tiene sus desventajas, el principal es el
problema del diamante en el cual no vamos a ahondar. Es por ello que muchos
lenguajes modernos han descartado la herencia múltiple, por ejemplo C# y
Java.
El Patrón Decorador es una forma de resolver este problema. Como su nombre
lo indica este Patrón está hecho para decorar una clase base, es como una
envoltura que podemos colocar sobre una clase y que le agrega funcionalidad
a esta, estas envolturas las podemos poner en el orden que queramos,
combinarlas, ponerlas más de una vez e inclusive quitarlas.
6. INGENIERIA INFORMATICA
MARCO TEORICO
1.DECORATOR
El Patrón Decorator Permite agregar funcionalidades y
responsabilidades a objetos de forma dinámica y transparente para el
usuario, esto se realiza por medio de relaciones con otras clases
extendiendo su funcionalidad al incorporar las de las clases asociadas,
de esta forma el patrón no es dependiente de la Herencia ya que aunque
esta puede jugar un papel importante, prevalece el uso de conceptos
como la composición al momento de definir comportamientos.
Este patrón de diseño nos permite modificar, retirar o agregar
responsabilidades a un objeto dinámicamente, las funcionalidades se
modifican/agregan/retiran durante la ejecución del script o aplicación.
La gran ventaja es que nos permite extender objetos incluso en
situaciones cuando la extensión vía herencia no es viable o no es
necesaria. Adicionalmente nos ayuda a conservar el principio de
Abierto/Cerrado, en donde se dicta que cada entidad debe estar abierta
a extensión pero cerrada a modificación.
Otra ventaja es que las decoraciones nos evitan la labor de crear clases
complejas con mucho código, que en la mayoría de los casos no será
evaluado. Nosotros podemos usar distintas combinaciones (o
secuencias) de decoraciones para generar distintos comportamientos o
resultados.
2.HERENCIA
La herencia es específica de la programación orientada a objetos, donde
una clase nueva se crea a partir de una clase existente. La herencia (a la
que habitualmente se denomina subclases) proviene del hecho de que la
subclase (la nueva clase creada) contiene las atributos y métodos de la
clase primaria. La principal ventaja de la herencia es la capacidad para
definir atributos y métodos nuevos para la subclase, que luego se
aplican
a
los
atributos
y
métodos
heredados.
7. INGENIERIA INFORMATICA
Esta particularidad permite crear una estructura jerárquica de clases
cada vez más especializada. La gran ventaja es que uno ya no debe
comenzar desde cero cuando desea especializar una clase existente.
Como resultado, se pueden adquirir bibliotecas de clases que ofrecen
una base que puede especializarse a voluntad (la compañía que vende
estas clases tiende a proteger las datos miembro usando la
encapsulación).
HERENCIA
3.ABSTRACCION
La abstracción encarada desde el punto de vista de la programación
orientada a objetos expresa las características esenciales de un objeto,
las cuales distinguen al objeto de los demás. Además de distinguir entre
los objetos provee límites conceptuales. Entonces se puede decir que la
encapsulación separa las características esenciales de las no esenciales,
dentro de un objeto. Si un objeto tiene más características de las
necesarias estos resultarán difíciles de usar, modificar, construir y
comprender.
La misma genera una ilusión de simplicidad debido a que minimiza la
cantidad de características que definen a un objeto.
8. INGENIERIA INFORMATICA
Durante años, los programadores se han dedicado a construir
aplicaciones muy parecidas que resolvían una y otra vez los mismos
problemas. Para conseguir que sus esfuerzos pudiesen ser utilizados por
otras personas se creó la POO que consiste en una serie de normas para
garantizar la interoperabilidad entre usuarios de manera que el código se
pueda reutilizar.
CAPITULO I: COMO ACTUA
El Problema.
Un restaurante de comidas rápidas ofrece 3 tipos de combos (Combo
Básico, Combo Familiar, Combo Especial) cada combo tiene
características diferentes en cuanto a cantidad, porciones, salsas entre
otros, el restaurante también ofrece la posiblidad de aumentar el pedido
mendiante diferentes porciones adicionales (Tomate, Papas, Carne,
Queso), se desea crear un sistema de pedidos que permita al usuario
seleccionar el combo deseado, así como armar su propio pedido con las
porciones adicionales, el sistema deberá informar sobre el pedido del
usuario y el valor total del mismo.
La Solución.
En el problema nos están solicitando algopuntual, fácilmente deducimos
que tenemos una familia de Combos en la que podemos usar la
herencia, pero si atacáramos nuestro problema solo con este concepto,
entonces tendríamos que crear clases concretas por cada posible
combinación de porciones adicionales, tal vez esto no sería problema y
el sistema funcione, pero si queremos realizar varias combinaciones
para crear nuevos pedidos tendríamos que entrar a modificar el código
fuente y luego ejecutar nuevamente la aplicación para que los cambios
puedan ser visualizados.... por esta razón anteriormente dijimos que
usando la herencia el comportamiento solo se definiría estáticamente
basados en lo heredado por las clases Padre.
9. INGENIERIA INFORMATICA
La solución que nos da el patrón Decorator es solo utilizar la herencia
para que las clases Decorator tengan el mismo tipo de los objetos a
decorar y utilizaremos la composición para determinar el
comportamiento de forma dinámica y en tiempo de ejecución basados
en concepto de "Usa" relacionando los decoradores con los
componentes concretos, así no modificaríamos la lógica de las clases
existentes cada vez.
DIAGRAMA DE CLASES DEL PROBLEMA PLANTEADO
Crearemos nuestro sistema ajustándonos al diagrama de clases del
patrón, tenemos una SuperClase Combo que representa los combos de
comidas rápidas disponibles de la cual heredan los tipos ComboBasico,
ComboFamiliar y ComboEspecial, también hereda de él las clases
Decorator, en este caso tenemos la clase de Adicionales como el
10. INGENIERIA INFORMATICA
decorador y a su vez las hijas que corresponden a cada porción, siendo
estas las clases decoradoras concretas....
Decoradores
Los Decoradores en este caso serán las porciones adicionales, tenemos
una clase AdicionalesDecorator que es el decorador principal del cual
implementaran los decoradores concretos, esta clase es hija de la clase
Combo y proporciona un método abstracto descripcion() para anexar a
la descripción del combo, la porción seleccionada por el usuario...
public abstract class AdicionalesDecorator extends Combo{
public abstract String getDescripcion();
}
Cada Decorador concreto implementa el método getDescripcion(),
agregando a la descripción la porción seleccionada por el usuario,
también implementa el método valor() de la clase Combo, en el cual se
agrega al valor del combo, el precio de la porción....... como vemos en
estos decoradores concretos se aplica la composición en el momento
que creamos el objeto combo (la clase Combo es abstracta por lo tanto
no puede ser instanciada directamente, por lo tanto el objeto que llega
como parámetro al constructor se creó previamente por medio de
polimorfismo).
11. INGENIERIA INFORMATICA
CONCLUSION
Como vemos el patrón nos facilita enormemente el trabajo en este tipo
de problemáticas imaginen tener que usar solo la herencia para crear un
Menú que cumpla con las necesidades de cada cliente, cuantas
combinaciones se tendrían que realizar por cada posible combinación,
en cambio con el patrón tan solo necesitamos las clases Bases y los
decoradores, gracias a la lógica aplicada, las combinaciones se realizan
solas.
La lógica del patrón actúa como envoltorios dependiendo de los
posibles tipos de combos y adicionales seleccionadas, si queremos un
combo familiar con papas extra entonces se crea esta agrupación, si
además escogemos una porción de queso entonces dicha porción es
agregada
a
la
anterior...
Cuando usamos este patrón reducimos las posibilidades de generar
errores o defectos secundarios no deseados, ya que si queremos añadir
nuevas funcionalidades, agregamos nuevo código sin modificar el
existente.
Con el Patrón los diseños son resistentes al cambio y lo suficientemente
flexibles
como
para
satisfacer
necesidades
cambiantes.
El patrón además de utilizar la herencia y la composición también aplica
conceptos de polimorfismo que pueden ser evidenciados en el código
fuente..
Como en todo la práctica es fundamental, por eso los invito a repasar el
Patrón y descargarlo para un mayor entendimiento.