Este proyecto implementa un sistema de gestión para un Centro de Convenciones utilizando los principios de la Programación Orientada a Objetos (POO) y varios patrones de diseño. Proporciona funcionalidades para gestionar espacios, reservas, productos y aspectos económicos del centro. En este proyecto conjunto mi compañero y yo obtuvimos una calificación de 9,6/10.
- Fabio Rodríguez Gómez
- Alfredo Sobrados González
- Gestión de espacios (alta, disponibilidad, y equipamientos).
- Gestión de reservas (creación, asignación de consumiciones, cancelación).
- Gestión de productos (creación de secciones y productos, disponibilidad).
- Gestión económica (cálculo de ingresos por espacio y generales).
- Clase aplicada:
Centro_Convenciones
. - Descripción: Asegura que exista solo una instancia del Centro de Convenciones.
- Clase aplicada:
Espacio
y sus decoradores. - Descripción: Permite agregar equipamientos opcionales (música, ornamentos, escenarios) a los espacios de manera dinámica.
- Clases aplicadas:
Carta
,Sección
, yProducto
. - Descripción: Modela la jerarquía de la carta de productos para una gestión uniforme de componentes simples (productos) y compuestos (secciones).
- Clases aplicadas: Clases de menús y submenús de gestión.
- Descripción: Permite manejar de forma dinámica los algoritmos de interacción en los menús.
Centro_Convenciones
: Clase principal, gestiona las reservas, espacios y la carta de productos.Espacio
: Representa un espacio del centro, que puede decorarse con opciones adicionales.Reserva
: Administra la información de las reservas, incluyendo espacios y consumiciones.Carta
: Administra la jerarquía de productos disponibles en el centro.Coste
: Clase auxiliar que almacena precios específicos para años determinados.MenuPrincipal
y subclases: Gestionan la interacción del usuario con las funcionalidades.
- Alta de nuevos espacios.
- Modificación de disponibilidad de espacios.
- Listado de espacios disponibles/no disponibles.
- Alta de reservas.
- Adición y eliminación de consumiciones.
- Listado de reservas y consulta de una reserva específica.
- Alta de secciones y productos.
- Modificación de disponibilidad de productos.
- Consulta de la carta organizada.
- Cálculo de ingresos por espacio.
- Cálculo de ingresos totales del Centro de Convenciones.
El proyecto incluye casos de prueba que verifican:
- Creación de espacios y reservas.
- Gestión de consumiciones y productos.
- Cálculos económicos.
El sistema serializa objetos a un archivo binario .dat para almacenar información de espacios, reservas y productos, garantizando la persistencia entre sesiones sin necesidad de bases de datos externas.
classDiagram
class Centro_Convenciones {
- instancia: Centro_Convenciones
- listaEspacios: ArrayList~Espacio~
- listaReservas: ArrayList~Reserva~
- carta: Seccion
+ obtenerInstanciaCC() Centro_Convenciones
+ buscarEspacio(cod: String) Espacio
+ existe(e: Espacio):boolean
+ altaEspacio(e: Espacio) boolean
+ alterarDispEspc(es:Espacio)
+ aniadirPrecioEspc(anio:int, es: Espacio, porcentaje: double)
+ listarInfoEspcDisponible()
+ listarInfoEspcNoDisponible()
+ listarAllEspacios()
- buscarReserva(id: String) Reserva
+ altaReserva(r: Reserva) boolean
+ bajaReserva(id: String)
+ aniadirConsumicionReserva(idR: String, con: Consumicion)
+ mostrarConsumicionesReserva(idR: String)
+ eliminarConsumicionReserva(idR: String, idC: String)
+ listarInfoReservas()
+ mostrarInfoReserva(id: String)
+ agregarSeccion(c: Carta)
+ agregarProducto(s: Carta, p: Carta)
+ obtenerLista(s: Seccion) ArrayList~Carta~
+ alterarDispProducto(p:Carta)
+ mostrarInfoCarta(cod:String)
+ calcularIngresosEspacio(fI: LocalDate, fF: LocalDate, es:Espacio) double
+ calcularIngresosCC(fI: LocalDate, fF: LocalDate) double
+ getCarta() Seccion
+ getListaEspacios() ArrayList~Espacio~
+ getListaReservas() ArrayList~Reserva~
}
class Espacio {
- codigo: String
- nombre: String
- superficie: double
- capacidad: int
- listaCostes: ArrayList~Coste~
- estado: boolean
+ getCodigo() String
+ getNombre() String
+ getSuperficie() double
+ getCapacidad() int
+ getEstado() boolean
+ getListaCostes() ArrayList~Coste~
+ setDisponibilidad(estado: boolean)
+ setListaCostes(c: Coste)
+ buscarCoste(anio: int) Coste
+ calcularIngreso() double
}
class Reserva {
- espacio: Espacio
- fecha: LocalDate
- cliente: String
- telefono: long
- id: String
- listaConsumiciones: ArrayList~Consumicion~
+ setFecha(fecha: LocalDate)
+ getEspacioDecorado() Espacio
+ getFecha() LocalDate
+ getCliente() String
+ getTelefono() long
+ getId() String
+ getListaConsumiciones() ArrayList~Consumicion~
+ aniadirConsumicion(consumicion: Consumicion)
- buscarConsumicion(id: String) Consumicion
+ eliminarConsumicion(id: String)
+ mostrarConsumiciones()
}
class Carta {
- nombre: String
- id: String
- descripcion: String
+ getNombre() String
+ getId() String
+ getDescripcion() String
+ getEstado() boolean
+ agregar(c: Carta)
+ mostrarInfo()
+ recuperarCarta(nombre: String) Carta
+ setListaCostes(c: Coste)
+ getLista() ArrayList~Carta~
+ setEstado(estado: boolean)
}
class Producto {
- listaCostes: ArrayList~Coste~
- estado: boolean
+ mostrarInfo()
+ agregar(e: Carta)
+ setEstado(estado: boolean)
+ setListaCostes(c: Coste)
+ getEstadoImprimir(estado:boolean) String
+ getEstado() boolean
+ getCostes() ArrayList<Coste>
+ recuperarCarta(id: String) Carta
+ getLista() ArrayList~Carta~
+ buscarCoste(anio: int) Coste
}
class EquipamientoDecorador {
- codigoNumerico: int
- descripcion: String
- espacio: Espacio
+ calcularIngreso(cod: String) double
+ getCodigoNum() int
+ getDescripcion() String
+ getCodigo() String
+ getNombre() String
+ getSuperficie() double
+ getCapacidad() int
+ getEstado() boolean
+ getDescripcion() String
+ calcularIngreso() double
}
class Ornamento {
- ingreso: double
+ getDescripcion() String
+ getNombre() String
+ calcularIngreso() double
}
class Musica {
- ingreso: double
+ getDescripcion() String
+ getNombre() String
+ calcularIngreso() double
}
class Escenario {
- ingreso: double
+ getDescripcion() String
+ getNombre() String
+ calcularIngreso() double
}
class MenuPrincipal {
- menus: ArrayList~Menus~
+ ejecutarOpciones() String
}
class Menus {
- centConv: Centro_Convenciones
+ getCentConv() Centro_Convenciones
+ ejecutar()
+ ejecutarOpciones() String
}
class GestionEspacios {
+ darAltaEspacio()
+ generarCodigoEspacio() String
+ aniadirPrecioEspacio()
+ hacerDisponible()
+ hacerNoDisponible()
+ ejecutarOpciones() String
}
class GestionReservas {
+ darAltaReserva()
+ generarCodigoReserva() String
+ generarCodigoConsumicion() String
+ contarNumeroConsumiciones() int
+ darBajaReserva()
+ mostrarInfoReservaConcreta()
+ aniadirConsumicionReserva()
+ eliminarConsumicionReserva()
+ ejecutarOpciones() String
}
class GestionCartaProductos {
+ darAltaSeccion()
+ contarNumeroSecciones() int
+ darAltaProducto()
+ contarNumeroProductos() int
+ generarCodigoSeccion() String
+ generarCodigoProducto() String
+ mostrarInfoProducto()
+ mostrarInfoSeccionConProductos()
+ hacerProductoDisponible()
+ hacerProductoNoDisponible()
+ mostrarInfoProductosDisponibles()
+ mostrarInfoProductosNoDisponibles()
+ ejecutarOpciones() String
}
class GestionEconomica {
+ mostrarIngresosEspacio()
+ mostrarIngresosCC()
+ ejecutarOpciones() String
}
class Coste {
- precio: double
- anio: int
+ getPrecio() double
+ getAnio() int
}
class Consumicion {
- producto: Producto
- cantidad: int
- id: String
+ getProducto() Producto
+ getCantidad() int
+ getId() String
+ calcularCosteConsumicion() double
}
class Seccion {
- listaProductos: ArrayList~Carta~
+ getEstado() boolean
+ getLista() ArrayList~Carta~
+ mostrarInfo()
+ agregar(c: Carta)
+ recuperarCarta(id: String) Carta
+ setListaCostes(c: Coste)
+ setEstado(estado:boolean)
}
Centro_Convenciones "1" *-- "0 .. *" Espacio
Centro_Convenciones "1" *-- "0 .. 1" Seccion
Centro_Convenciones <.. Reserva : uso
Reserva "1" -- "0 .. *" Consumicion : tiene varias
EquipamientoDecorador --|> Espacio
EquipamientoDecorador <|-- Ornamento: {no excluyente, total}
EquipamientoDecorador <|-- Musica: {no excluyente, total}
EquipamientoDecorador <|-- Escenario: {no excluyente, total}
Espacio "1" -- "0 .. 1" EquipamientoDecorador : se utiliza en
Carta <|-- Producto
Carta <|-- Seccion
Carta "0..*" -- "1" Seccion
Espacio "1" -- "0 .. *" Coste
Reserva "0 .. *" -- "1" EquipamientoDecorador: puede tener varias
EquipamientoDecorador "1" -- "0 .. 1" Reserva: Permite guardar el objeto Espacio decorado
EquipamientoDecorador "1" -- "0 .. *" Coste
Consumicion "0 .. 1" --> "1" Producto: tiene o puede tener
Coste "0 .. *" -- "1" Producto: tiene
Menus "0..1" -- "1" Centro_Convenciones: provee de funcionalidades a la estrategia
MenuPrincipal --|> Menus
MenuPrincipal "1" -- "0 .. *" Menus: puede tener varios
Menus <|-- GestionEspacios
Menus <|-- GestionReservas
Menus <|-- GestionCartaProductos
Menus <|-- GestionEconomica
Puedes usar tu IDE favorito a continuación se muestran los pasos con dos IDEs
-
Abre IntelliJ IDEA.
-
Ve a File > Open y selecciona la carpeta del repositorio que clonaste de GitHub.
-
IntelliJ detectará automáticamente si el proyecto es de Java. Si no, te pedirá que configures un SDK de Java.
- Si es la primera vez, selecciona un JDK en tu máquina o descárgalo desde IntelliJ. Asegúrate de usar JDK 8 o superior.
-
Asegúrate de que tu archivo fuente (
Main.java
) (Clase principal de cada proyecto con el método main) esté dentro de una carpeta llamadasrc
o algo similar. La estructura típica sería:repositorio/ ├── src/ │ └── com/ │ └── ejemplo/ │ └── Main.java
-
Si no tienes esta estructura, puedes configurar el directorio como "fuente" (
Source Root
):- Haz clic derecho en la carpeta
src
. - Selecciona Mark Directory as > Sources Root.
- Haz clic derecho en la carpeta
- Abre el archivo
Main.java
en IntelliJ. - Busca el botón verde con forma de triángulo ▶ junto al método
main
. - Haz clic en ese botón y selecciona Run 'Main'.
- IntelliJ compilará automáticamente el programa y lo ejecutará en la consola integrada.
Si tu programa requiere argumentos de entrada, puedes configurarlos fácilmente:
- Ve a Run > Edit Configurations.
- Selecciona la configuración de tu clase principal (
Main
). - En el campo Program Arguments, escribe los argumentos separados por espacios (por ejemplo,
arg1 arg2
). - Haz clic en OK y vuelve a ejecutar el programa.
- Abre Eclipse.
- Ve a File > Import > Existing Projects into Workspace.
- Selecciona la carpeta del repositorio clonado de GitHub y haz clic en Finish.
-
Asegúrate de que tu archivo
Main.java
(Clase principal de cada proyecto con el método main) esté dentro de una carpeta marcada como src. Por ejemplo:repositorio/ ├── src/ │ └── com/ │ └── ejemplo/ │ └── Main.java
-
Si Eclipse no reconoce la carpeta como fuente, haz clic derecho en el proyecto:
- Ve a Build Path > Configure Build Path.
- En la pestaña Source, añade la carpeta
src
como fuente si no está configurada.
- Haz doble clic en el archivo
Main.java
para abrirlo en el editor. - Haz clic derecho en cualquier parte del archivo y selecciona Run As > Java Application.
- Eclipse compilará automáticamente el programa y lo ejecutará en la consola de Eclipse.
Si necesitas agregar argumentos de entrada:
- Haz clic derecho sobre el archivo
Main.java
. - Ve a Run As > Run Configurations.
- En la pestaña Arguments, escribe los argumentos en el campo Program Arguments.
- Haz clic en Apply y luego en Run.
El proyecto "Centro de Convenciones - Sistema de Gestión" destaca por su implementación efectiva de los principios de la Programación Orientada a Objetos (POO) y patrones de diseño como Singleton, Decorator, Composite y Strategy, que aportan flexibilidad, escalabilidad y reutilización al código. Su estructura modular y jerárquica, con una clara separación de responsabilidades entre clases como Espacio
, Reserva
y Carta
, facilita el mantenimiento y futuras ampliaciones. Además, el sistema cubre áreas clave de gestión, como espacios, reservas, productos y aspectos económicos, haciéndolo práctico y aplicable a escenarios reales. La documentación incluye un detallado diagrama de clases que describe las relaciones entre los componentes, proporcionando una referencia clara para desarrolladores. Los casos de prueba aseguran la fiabilidad del sistema, validando funciones críticas como los cálculos económicos. Por último, el reconocimiento del esfuerzo colaborativo y la calificación sobresaliente de 9,6/10 reflejan tanto la calidad técnica como el compromiso del equipo.
Agradezco a mis profesores y compañeros por su apoyo y orientación durante el desarrollo de esta práctica. Sus aportes han sido fundamentales para el éxito de este proyecto.
Si deseas contribuir a este proyecto, no dudes en hacer un fork del repositorio, proponer mejoras o reportar problemas. ¡Toda ayuda es bienvenida!
Para cualquier consulta o comentario sobre este proyecto, puedes contactarme a través de mi perfil de GitHub.