/*
*NOTA DEL AUTOR: Este código se implemento en diversos archivos, sin embargo, debido a la naturaleza de la plataforma, se colocó en un solo comentario, por lo que se recomienda guardar un archivo por cada clase, o en su defecto, remover las instrucciones "require_once". Las pruebas realizadas fueron ejecutadas en un servidor Apache provisto por XAMPP.
*/
/**
* Fabrica abstracta para implementar fabrica concreta de habitaciones.
*/
abstract class AbstractFactoryHabitacion{
abstract public function datosIniciales($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio);
abstract public function visualizarDatosHabitacion();
abstract public function modificarFechaEntrada($strFechaEntrada, $intCargoAgregado);
//Posibles servicios
abstract public function crearLlave();
abstract public function crearPaquete($intNoPaquete);
abstract public function asignarServicios($strServicios, $precioServicio);
abstract public function asignarProductos($strProductos, $precioProducto);
}
/**
* Esta clase dedicada a la fabrica concreta de habitación doble
* la cual se encarga de implementar los métodos descritos en
* AbstractFactoryHabitacion.php
*/
require_once("HabitacionDoble.php");
require_once("AbstractFactoryHabitacion.php");
class FabricaHDoble extends AbstractFactoryHabitacion{
/**
* Atributos
*/
private $HabitacionDoble;
private $intCargoAgregado;
private $strLlave;
/**
* Métodos Abstractos implementados
*/
public function __construct($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio){
$this->datosIniciales($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio);
}
public function datosIniciales($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio){
$this->HabitacionDoble = new HabitacionDoble($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio);
}
public function visualizarDatosHabitacion(){
$this->HabitacionDoble->visualizaDatos();
}
public function asignarServicios($strNombreServicio, $precioServicio){
$this->HabitacionDoble->cargarServicio($strNombreServicio);
$this->HabitacionDoble->realizarCargo($precioServicio);
$this->HabitacionDoble->verServiciosCargados();
}
public function asignarProductos($strNombreProducto, $precioProducto){
$this->HabitacionDoble->cargarProducto($strNombreProducto);
$this->HabitacionDoble->realizarCargo($precioProducto);
$this->HabitacionDoble->verProductosCargados();
}
public function crearPaquete($intNoPaquete){
echo "
OPCIONES DE PAQUETES
|
SERVICIO |
PRODUCTO |
PAQUETE 1 |
Spa, Lavanderia & Cena |
Toalla (1pz), Vino (1pz) |
PAQUETE 2 |
Taxi, Spa, & Alberca |
Desayuno, Cena & Playeras Especiales (2pz) |
PAQUETE 3 |
Tour, Transporte & Parque de Diversiones |
Sudadera Especial, Comida & Cena |
";
switch($intNoPaquete){
case 1:
echo "
ELIGIÓ PAQUETE 1
|
SERVICIO |
PRODUCTO |
|
Spa, Lavanderia & Cena |
Toalla (1pz), Vino (1pz) |
";
/**
* Servicios
*/
$this->HabitacionDoble->cargarServicio("Spa");
$this->HabitacionDoble->realizarCargo(150);
$this->HabitacionDoble->cargarServicio("Lavanderia");
$this->HabitacionDoble->realizarCargo(50);
$this->HabitacionDoble->cargarServicio("Cena");
$this->HabitacionDoble->realizarCargo(100);
/**
* Productos
*/
$this->HabitacionDoble->cargarProducto("Toalla");
$this->HabitacionDoble->realizarCargo(100);
$this->HabitacionDoble->cargarProducto("Vino");
$this->HabitacionDoble->realizarCargo(250);
/**
* Muestra de productos y servicios cargados
*/
$this->HabitacionDoble->verServiciosCargados();
$this->HabitacionDoble->verProductosCargados();
break;
case 2:
echo "
ELIGIÓ PAQUETE 2
|
SERVICIO |
PRODUCTO |
|
Taxi, Spa, & Alberca |
Desayuno, Cena & Playeras Especiales (2pz) |
";
/**
* Servicios
*/
$this->HabitacionDoble->cargarServicio("Spa");
$this->HabitacionDoble->realizarCargo(150);
$this->HabitacionDoble->cargarServicio("Taxi");
$this->HabitacionDoble->realizarCargo(50);
$this->HabitacionDoble->cargarServicio("Alberca");
$this->HabitacionDoble->realizarCargo(10);
/**
* Productos
*/
$this->HabitacionDoble->cargarProducto("Desayuno");
$this->HabitacionDoble->realizarCargo(100);
$this->HabitacionDoble->cargarProducto("Cena");
$this->HabitacionDoble->realizarCargo(150);
$this->HabitacionDoble->cargarProducto("Playera Especial");
$this->HabitacionDoble->realizarCargo(70);
$this->HabitacionDoble->cargarProducto("Playera Especial");
$this->HabitacionDoble->realizarCargo(70);
/**
* Muestra de productos y servicios cargados
*/
$this->HabitacionDoble->verServiciosCargados();
$this->HabitacionDoble->verProductosCargados();
break;
case 3:
echo "
ELIGIÓ PAQUETE 2
|
SERVICIO |
PRODUCTO |
|
Tour, Transporte & Parque de Diversiones |
Sudadera Especial, Comida & Cena |
";
/**
* Servicios
*/
$this->HabitacionDoble->cargarServicio("Tour");
$this->HabitacionDoble->realizarCargo(150);
$this->HabitacionDoble->cargarServicio("Transporte");
$this->HabitacionDoble->realizarCargo(70);
$this->HabitacionDoble->cargarServicio("Parque de Diversiones");
$this->HabitacionDoble->realizarCargo(100);
/**
* Productos
*/
$this->HabitacionDoble->cargarProducto("Comida");
$this->HabitacionDoble->realizarCargo(120);
$this->HabitacionDoble->cargarProducto("Cena");
$this->HabitacionDoble->realizarCargo(150);
$this->HabitacionDoble->cargarProducto("Sudadera Especial");
$this->HabitacionDoble->realizarCargo(150);
/**
* Muestra de productos y servicios cargados
*/
$this->HabitacionDoble->verServiciosCargados();
$this->HabitacionDoble->verProductosCargados();
break;
}
}
public function modificarFechaEntrada($strFechaEntrada, $intCargoAgregado){
$this->intCargoAgregado = ($intCargoAgregado*1.5);
$this->HabitacionDoble->cambiarFechaEntrada($strNombreServicio, $intCargoAgregado);
echo "Cargo por cambio de fecha: ".$this->intCargoAgregado;
echo "Total de cargos: ".$this->HabitacionDoble->getTotalDeCargos();
}
public function crearLlave(){
$strCaracteresLlave = $this->HabitacionDoble->getNombre().'0123456789';
$this->strLlave = substr(str_shuffle($strCaracteresLlave), 0, 10);
$this->HabitacionDoble->setLlave($this->strLlave);
echo "La llave creada es: ".$this->HabitacionDoble->getLlave();
}
}
/**
* Esta clase dedicada a la fabrica concreta de habitación simple
* la cual se encarga de implementar los métodos descritos en
* AbstractFactoryHabitacion.php
*/
require_once("HabitacionSimple.php");
require_once("AbstractFactoryHabitacion.php");
class FabricaHSimple extends AbstractFactoryHabitacion{
private $HabitacionSimple;
private $intCargoAgregado;
private $strLlave;
/**
* Métodos Abstractos implementados
*/
public function __construct($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio){
$this->datosIniciales($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio);
}
public function datosIniciales($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio){
$this->HabitacionSimple = new HabitacionSimple($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio);
}
public function visualizarDatosHabitacion(){
$this->HabitacionSimple->visualizaDatos();
}
public function asignarServicios($strNombreServicio, $precioServicio){
$this->HabitacionSimple->cargarServicio($strNombreServicio);
$this->HabitacionSimple->realizarCargo($precioServicio);
$this->HabitacionSimple->verServiciosCargados();
}
public function asignarProductos($strNombreProducto, $precioProducto){
$this->HabitacionSimple->cargarProducto($strNombreProducto);
$this->HabitacionSimple->realizarCargo($precioProducto);
$this->HabitacionSimple->verProductosCargados();
}
public function crearPaquete($intNoPaquete){
echo "
OPCIONES DE PAQUETES
|
SERVICIO |
PRODUCTO |
PAQUETE 1 |
Lavanderia & Transporte |
Libreta (1pz), Vino (1pz) |
PAQUETE 2 |
Transporte & Parque de Diversiones |
Cena & Playera Especial |
";
switch($intNoPaquete){
case 1:
echo "
ELIGIÓ PAQUETE 1
|
SERVICIO |
PRODUCTO |
|
Lavanderia & Transporte |
Libreta (1pz), Vino (1pz) |
";
/**
* Servicios
*/
$this->HabitacionSimple->cargarServicio("Lavanderia");
$this->HabitacionSimple->realizarCargo(50);
$this->HabitacionSimple->cargarServicio("Transporte");
$this->HabitacionSimple->realizarCargo(100);
/**
* Productos
*/
$this->HabitacionSimple->cargarProducto("Libreta");
$this->HabitacionSimple->realizarCargo(50);
$this->HabitacionSimple->cargarProducto("Vino");
$this->HabitacionSimple->realizarCargo(250);
/**
* Muestra de productos y servicios cargados
*/
$this->HabitacionSimple->verServiciosCargados();
$this->HabitacionSimple->verProductosCargados();
break;
case 2:
echo "
ELIGIÓ PAQUETE 2
|
SERVICIO |
PRODUCTO |
|
Transporte & Parque de Diversiones |
Cena & Playera Especial |
";
/**
* Servicios
*/
$this->HabitacionSimple->cargarServicio("Parque de Diversiones");
$this->HabitacionSimple->realizarCargo(150);
$this->HabitacionSimple->cargarServicio("Transporte");
$this->HabitacionSimple->realizarCargo(50);
/**
* Productos
*/
$this->HabitacionSimple->cargarProducto("Cena");
$this->HabitacionSimple->realizarCargo(150);
$this->HabitacionSimple->cargarProducto("Playera Especial");
$this->HabitacionSimple->realizarCargo(70);
/**
* Muestra de productos y servicios cargados
*/
$this->HabitacionSimple->verServiciosCargados();
$this->HabitacionSimple->verProductosCargados();
break;
}
}
public function modificarFechaEntrada($strFechaEntrada, $intCargoAgregado){
$this->intCargoAgregado = ($intCargoAgregado*2);
$this->HabitacionSimple->cambiarFechaEntrada($strNombreServicio, $intCargoAgregado);
echo "Cargo por cambio de fecha: ".$this->intCargoAgregado;
echo "Total de cargos: ".$this->HabitacionSimple->getTotalDeCargos();
}
public function crearLlave(){
$strCaracteresLlave = $this->HabitacionSimple->getNombre().'0123456789';
$this->strLlave = substr(str_shuffle($strCaracteresLlave), 0, 10);
$this->HabitacionSimple->setLlave($this->strLlave);
echo "La llave creada es: ".$this->HabitacionSimple->getLlave();
}
}
/**
* Esta clase dedicada a la fabrica concreta de habitación suite
* la cual se encarga de implementar los métodos descritos en
* AbstractFactoryHabitacion.php
*/
require_once("HabitacionSuite.php");
require_once("AbstractFactoryHabitacion.php");
class FabricaHSuite extends AbstractFactoryHabitacion{
/**
* Atributos
*/
private $HabitacionSuite;
private $intCargoAgregado;
private $strLlave;
/**
* Métodos Abstractos implementados
*/
public function __construct($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio){
$this->datosIniciales($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio);
}
public function datosIniciales($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio){
$this->HabitacionSuite = new HabitacionSuite($strNombre, $intNumeroHabitacion, $strFechaEntrada, $intPrecio);
}
public function visualizarDatosHabitacion(){
$this->HabitacionSuite->visualizaDatos();
}
public function asignarServicios($strNombreServicio, $precioServicio){
$this->HabitacionSuite->cargarServicio($strNombreServicio);
$this->HabitacionSuite->realizarCargo($precioServicio);
$this->HabitacionSuite->verServiciosCargados();
}
public function asignarProductos($strNombreProducto, $precioProducto){
$this->HabitacionSuite->cargarProducto($strNombreProducto);
$this->HabitacionSuite->realizarCargo($precioProducto);
$this->HabitacionSuite->verProductosCargados();
}
public function crearPaquete($intNoPaquete){
echo "
OPCIONES DE PAQUETES
|
SERVICIO |
PRODUCTO |
PAQUETE 1 |
Spa, Visita Arqueologico & Cena |
Playera Especial (1pz), Gorra (1pz), Bata de Spa (1pz) |
PAQUETE 2 |
Concierto de Jazz, Visita Museo, Comida & Cena |
Disco de Jazz (1pz), Souvenir del Museo (1pz), Vino (1pz) |
PAQUETE 3 |
Tour, Transporte, Gran Premio de México, Comida & Cena |
Sudadera Especial, Gorra Conmemorativa, Pulsera Especial |
";
switch($intNoPaquete){
case 1:
echo "
ELIGIÓ PAQUETE 1
|
SERVICIO |
PRODUCTO |
|
Spa, Visita Arqueologico & Cena |
Playera Especial (1pz), Gorra (1pz), Bata de Spa (1pz) |
";
/**
* Servicios
*/
$this->HabitacionSuite->cargarServicio("Spa");
$this->HabitacionSuite->realizarCargo(100);
$this->HabitacionSuite->cargarServicio("Visita Arqueologica");
$this->HabitacionSuite->realizarCargo(50);
$this->HabitacionSuite->cargarServicio("Cena");
$this->HabitacionSuite->realizarCargo(80);
/**
* Productos
*/
$this->HabitacionSuite->cargarProducto("Playera Especial");
$this->HabitacionSuite->realizarCargo(100);
$this->HabitacionSuite->cargarProducto("Gorra");
$this->HabitacionSuite->realizarCargo(50);
$this->HabitacionSuite->cargarProducto("Bata de Spa");
$this->HabitacionSuite->realizarCargo(200);
/**
* Muestra de productos y servicios cargados
*/
$this->HabitacionSuite->verServiciosCargados();
$this->HabitacionSuite->verProductosCargados();
break;
case 2:
echo "
ELIGIÓ PAQUETE 2
|
SERVICIO |
PRODUCTO |
|
Concierto de Jazz, Visita Museo, Comida & Cena |
Disco de Jazz (1pz), Souvenir del Museo (1pz), Vino (1pz) |
";
/**
* Servicios
*/
$this->HabitacionSuite->cargarServicio("Concierto de Jazz");
$this->HabitacionSuite->realizarCargo(150);
$this->HabitacionSuite->cargarServicio("Visita Museo");
$this->HabitacionSuite->realizarCargo(50);
$this->HabitacionSuite->cargarServicio("Comida");
$this->HabitacionSuite->realizarCargo(100);
$this->HabitacionSuite->cargarServicio("Cena");
$this->HabitacionSuite->realizarCargo(80);
/**
* Productos
*/
$this->HabitacionSuite->cargarProducto("Disco de Jazz");
$this->HabitacionSuite->realizarCargo(30);
$this->HabitacionSuite->cargarProducto("Souvenir del Museo");
$this->HabitacionSuite->realizarCargo(100);
$this->HabitacionSuite->cargarProducto("Vino");
$this->HabitacionSuite->realizarCargo(70);
/**
* Muestra de productos y servicios cargados
*/
$this->HabitacionSuite->verServiciosCargados();
$this->HabitacionSuite->verProductosCargados();
break;
case 3:
echo "
ELIGIÓ PAQUETE 3
|
SERVICIO |
PRODUCTO |
|
Tour, Transporte, Gran Premio de México, Comida & Cena |
Sudadera Especial, Gorra Conmemorativa, Pulsera Especial |
";
/**
* Servicios
*/
$this->HabitacionSuite->cargarServicio("Tour");
$this->HabitacionSuite->realizarCargo(150);
$this->HabitacionSuite->cargarServicio("Transporte");
$this->HabitacionSuite->realizarCargo(70);
$this->HabitacionSuite->cargarServicio("Gran Premio de México");
$this->HabitacionSuite->realizarCargo(1000);
$this->HabitacionSuite->cargarServicio("Comida");
$this->HabitacionSuite->realizarCargo(100);
$this->HabitacionSuite->cargarServicio("Cena");
$this->HabitacionSuite->realizarCargo(80);
/**
* Productos
*/
$this->HabitacionSuite->cargarProducto("Gorra Conmemorativa");
$this->HabitacionSuite->realizarCargo(120);
$this->HabitacionSuite->cargarProducto("Pulsera Especial");
$this->HabitacionSuite->realizarCargo(50);
$this->HabitacionSuite->cargarProducto("Sudadera Especial");
$this->HabitacionSuite->realizarCargo(150);
/**
* Muestra de productos y servicios cargados
*/
$this->HabitacionSuite->verServiciosCargados();
$this->HabitacionSuite->verProductosCargados();
break;
}
}
public function modificarFechaEntrada($strFechaEntrada, $intCargoAgregado){
$this->intCargoAgregado = ($intCargoAgregado*1.5);
$this->HabitacionSuite->cambiarFechaEntrada($strNombreServicio, $intCargoAgregado);
echo "Cargo por cambio de fecha: ".$this->intCargoAgregado;
echo "Total de cargos: ".$this->HabitacionSuite->getTotalDeCargos();
}
public function crearLlave(){
$strCaracteresLlave = $this->HabitacionSuite->getNombre().'0123456789';
$this->strLlave = substr(str_shuffle($strCaracteresLlave), 0, 10);
$this->HabitacionSuite->setLlave($this->strLlave);
echo "La llave creada es: ".$this->HabitacionSuite->getLlave();
}
}
/**
* Esta es la clase abstracta base de habitación; esta clase ha de contener
* servicios así mismo, características propias de la habitación,
* esta es la clase que heredará características a Habitacion Simple,
* Suite y Doble.
*/
abstract class Habitacion{
abstract public function visualizaDatos();
abstract public function setDatos($strNombre, $intNumeroHabitacion, $intPrecio, $strFechaEntrada, $strNombreOcupanteA, $strNombreOcupanteB);
abstract public function getPrecio();
abstract public function setPrecio($intPrecio);
abstract public function setNombre($strNombre);
abstract public function getNombre();
abstract public function setEstadoHabitacion($strEstado);
abstract public function getEstadoHabitacion();
abstract public function cambiarFechaEntrada($strFechaEntrada, $intCargoAgregado);
abstract public function getFechaEntrada();
abstract public function setFechaSalida($strFechaSalida);
abstract public function getFechaSalida();
abstract public function getTotalDeCargos();
//Posibles servicios
abstract public function setLlave($strLlave);
abstract public function getLlave();
abstract public function getEstadoPago($intNumeroTarjeta);
abstract public function cargarServicio($strServicio);
abstract public function verServiciosCargados();
abstract public function cargarProducto($strProducto);
abstract public function verProductosCargados();
abstract public function realizarCargo($intCargoAgregado);
}
/**
* Esta clase hereda de la clase Habitacion; implementa métodos propios de
* la habitación. Clase destinada al objeto concreto Habitación Doble
*/
require_once("Habitacion.php");
class HabitacionDoble extends Habitacion{
/**
* Atributos
*/
private $strNombre;
private $intNumeroHabitacion;
private $strFechaEntrada;
private $intPrecio;
private $strEstadoHabitacion;
private $strFechaSalida;
private $strLlave;
private $intTotalCargos;
private $strCaracteresLlave;
private $strNombreOcupanteA;
private $strNombreOcupanteB;
private $listaServicios;
private $listaProductos;
/**
* Constructor
*/
public function __construct($strNombre, $intNumeroHabitacion, $strFechaEntrada){
$this->strNombre = $strNombre;
$this->intNumeroHabitacion = $intNumeroHabitacion;
$this->strFechaEntrada = $strFechaEntrada;
$this->strCaracteresLlave = $intNumeroHabitacion.$strNombre;
//$this->strLlave = substr(str_shuffle($this->strCaracteresLlave), 0, 10);
$this->listaServicios = new SplDoublyLinkedList();
$this->listaProductos = new SplDoublyLinkedList();
}
/**
* Métodos Abstractos implementados
*/
public function setDatos($strNombre, $intNumeroHabitacion, $intPrecio, $strFechaEntrada, $strNombreOcupanteA, $strNombreOcupanteB){
$this->strNombre = $strNombre;
$this->intNumeroHabitacion = $intNumeroHabitacion;
$this->strFechaEntrada = $strFechaEntrada;
$this->strNombreOcupanteA = $strNombreOcupanteA;
$this->strNombreOcupanteB = $strNombreOcupanteB;
}
public function visualizaDatos(){
echo "
Nombre del reservante
| Nombre del ocupante 1
| Nombre del ocupante 2
| Número de habitación
| Fecha de Entrada
| Precio de la habitación
| Estado de la habitación
| Llave de la habitación
|
";
echo "
$this->strNombre |
$this->strNombreOcupanteA |
$this->strNombreOcupanteB |
$this->intNumeroHabitacion |
$this->strFechaEntrada |
$this->intPrecio |
$this->strEstadoHabitacion |
$this->strLlave |
";
}
public function setPrecio($intPrecio){
$this->intPrecio = $intPrecio;
}
public function getPrecio(){
return $this->intPrecio;
}
public function setNombre($strNombre){
$this->strNombre = $strNombre;
}
public function getNombre(){
return $this->strNombre;
}
public function setEstadoHabitacion($strEstado){
$this->strEstado = strtoupper($strEstado);
}
public function getEstadoHabitacion(){
return $this->strEstado;
}
public function cambiarFechaEntrada($strFechaEntrada, $intCargoAgregado){
$this->strFechaEntrada = $strFechaEntrada;
$this->intTotalCargos += $intCargoAgregado;
}
public function getFechaEntrada(){
return $this->strFechaEntrada;
}
public function setFechaSalida($strFechaSalida){
if(strcmp(getEstadoHabitacion(),"PAGADA") != 0){
$this->strFechaSalida = "HABITACION NO PAGADA";
}
else{
$this->strFechaSalida = $strFechaSalida;
}
}
public function getFechaSalida(){
return $this->strFechaSalida;
}
public function realizarCargo($intCargoAgregado){
$this->intTotalCargos += $intCargoAgregado;
}
public function getTotalDeCargos(){
return $this->intTotalCargos;
}
public function setLlave($strLlave){
$this->strLlave = $strLlave;
}
public function getLlave(){
return $this->strLlave;
}
public function getEstadoPago($intNumeroTarjeta){
$this->intTotalCargos *= .95;
echo "Validando forma de pago";
echo "Total a pagar:".$this->intTotalCargos;
echo "Descuento: 5%";
echo "Pago realizado";
setEstadoHabitacion("Pagada");
return $this->strEstadoHabitacion;
}
public function cargarServicio($strServicio){
$this->listaServicios->push($strServicio);
}
public function verServiciosCargados(){
echo "
";
for ($this->listaServicios->rewind(); $this->listaServicios->valid(); $this->listaServicios->next()) {
echo "";
echo "Nombre del servicio";
echo " | ";
}
echo " Total del costo de servicios | ";
echo "
";
echo "";
$this->listaServicios->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($this->listaServicios->rewind(); $this->listaServicios->valid(); $this->listaServicios->next()) {
echo "";
echo $this->listaServicios->current();
echo " | ";
}
echo "";
echo $this->intTotalCargos;
echo " | ";
echo "
";
}
public function cargarProducto($strProducto){
$this->listaProductos->push($strProducto);
}
public function verProductosCargados(){
echo "
";
for ($this->listaProductos->rewind(); $this->listaProductos->valid(); $this->listaProductos->next()) {
echo "";
echo "Nombre del servicio";
echo " | ";
}
echo " Total del costo de servicios | ";
echo "
";
echo "";
$this->listaProductos->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($this->listaProductos->rewind(); $this->listaProductos->valid(); $this->listaProductos->next()) {
echo "";
echo $this->listaProductos->current();
echo " | ";
}
echo "";
echo $this->intTotalCargos;
echo " | ";
echo "
";
}
}
/**
* Esta clase hereda de la clase Habitacion; implementa métodos propios de
* la habitación. Clase destinada al objeto concreto Habitación Simple
*/
require_once("Habitacion.php");
class HabitacionSimple extends Habitacion{
/**
* Atributos
*/
private $strNombre;
private $intNumeroHabitacion;
private $strFechaEntrada;
private $intPrecio;
private $strEstadoHabitacion;
private $strFechaSalida;
private $strLlave;
private $intTotalCargos;
private $strCaracteresLlave;
private $listaServicios;
private $listaProductos;
/**
* Constructor
*/
public function __construct($strNombre, $intNumeroHabitacion, $strFechaEntrada){
$this->strNombre = $strNombre;
$this->intNumeroHabitacion = $intNumeroHabitacion;
$this->strFechaEntrada = $strFechaEntrada;
$this->strCaracteresLlave = $intNumeroHabitacion.$strNombre;
//$this->strLlave = substr(str_shuffle($this->strCaracteresLlave), 0, 10);
$this->listaServicios = new SplDoublyLinkedList();
$this->listaProductos = new SplDoublyLinkedList();
}
/**
* Métodos Abstractos implementados
*/
public function setDatos($strNombre, $intNumeroHabitacion, $intPrecio, $strFechaEntrada, $strNombreOcupanteA, $strNombreOcupanteB){
$this->strNombre = $strNombre;
$this->intNumeroHabitacion = $intNumeroHabitacion;
$this->strFechaEntrada = $strFechaEntrada;
$this->intPrecio = $intPrecio;
}
public function visualizaDatos(){
echo "
Nombre del reservante
| Número de habitación
| Fecha de Entrada
| Precio de la habitación
| Estado de la habitación
| Llave de la habitación
|
";
echo "
$this->strNombre |
$this->intNumeroHabitacion |
$this->strFechaEntrada |
$this->intPrecio |
$this->strEstadoHabitacion |
$this->strLlave |
";
}
public function setPrecio($intPrecio){
$this->intPrecio = $intPrecio;
}
public function getPrecio(){
return $this->intPrecio;
}
public function setNombre($strNombre){
$this->strNombre = $strNombre;
}
public function getNombre(){
return $this->strNombre;
}
public function setEstadoHabitacion($strEstado){
$this->strEstado = strtoupper($strEstado);
}
public function getEstadoHabitacion(){
return $this->strEstado;
}
public function cambiarFechaEntrada($strFechaEntrada, $intCargoAgregado){
$this->strFechaEntrada = $strFechaEntrada;
$this->intTotalCargos += $intCargoAgregado;
}
public function getFechaEntrada(){
return $this->strFechaEntrada;
}
public function setFechaSalida($strFechaSalida){
if(strcmp(getEstadoHabitacion(),"PAGADA") != 0){
$this->strFechaSalida = "HABITACION NO PAGADA";
}
else{
$this->strFechaSalida = $strFechaSalida;
}
}
public function getFechaSalida(){
return $this->strFechaSalida;
}
public function realizarCargo($intCargoAgregado){
$this->intTotalCargos += $intCargoAgregado;
}
public function getTotalDeCargos(){
return $this->intTotalCargos;
}
public function setLlave($strLlave){
$this->strLlave = $strLlave;
}
public function getLlave(){
return $this->strLlave;
}
public function getEstadoPago($intNumeroTarjeta){
echo "Validando forma de pago";
echo "Total a pagar:".$this->intTotalCargos;
echo "Pago realizado";
setEstadoHabitacion("Pagada");
return $this->strEstadoHabitacion;
}
public function cargarServicio($strServicio){
$this->listaServicios->push($strServicio);
}
public function verServiciosCargados(){
echo "
";
for ($this->listaServicios->rewind(); $this->listaServicios->valid(); $this->listaServicios->next()) {
echo "";
echo "Nombre del servicio";
echo " | ";
}
echo " Total del costo de servicios | ";
echo "
";
echo "";
$this->listaServicios->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($this->listaServicios->rewind(); $this->listaServicios->valid(); $this->listaServicios->next()) {
echo "";
echo $this->listaServicios->current();
echo " | ";
}
echo "";
echo $this->intTotalCargos;
echo " | ";
echo "
";
}
public function cargarProducto($strProducto){
$this->listaProductos->push($strProducto);
}
public function verProductosCargados(){
echo "
";
for ($this->listaProductos->rewind(); $this->listaProductos->valid(); $this->listaProductos->next()) {
echo "";
echo "Nombre del producto";
echo " | ";
}
echo " Total del costo de los productos | ";
echo "
";
echo "";
$this->listaProductos->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($this->listaProductos->rewind(); $this->listaProductos->valid(); $this->listaProductos->next()) {
echo "";
echo $this->listaProductos->current();
echo " | ";
}
echo "";
echo $this->intTotalCargos;
echo " | ";
echo "
";
}
}
/**
* Esta clase hereda de la clase Habitacion; implementa métodos propios de
* la habitación. Clase destinada al objeto concreto Habitación Suite
*/
require_once("Habitacion.php");
class HabitacionSuite extends Habitacion{
/**
* Atributos
*/
private $strNombre;
private $intNumeroHabitacion;
private $strFechaEntrada;
private $intPrecio;
private $strEstadoHabitacion;
private $strFechaSalida;
private $strLlave;
private $intTotalCargos;
private $strCaracteresLlave;
private $listaServicios;
private $listaProductos;
/**
* Constructor
*/
public function __construct($strNombre, $intNumeroHabitacion, $strFechaEntrada){
$this->strNombre = $strNombre;
$this->intNumeroHabitacion = $intNumeroHabitacion;
$this->strFechaEntrada = $strFechaEntrada;
$this->strCaracteresLlave = $intNumeroHabitacion.$strNombre;
//$this->strLlave = substr(str_shuffle($this->strCaracteresLlave), 0, 10);
$this->listaServicios = new SplDoublyLinkedList();
$this->listaProductos = new SplDoublyLinkedList();
}
/**
* Métodos Abstractos implementados
*/
public function setDatos($strNombre, $intNumeroHabitacion, $intPrecio, $strFechaEntrada, $strNombreOcupanteA, $strNombreOcupanteB){
$this->strNombre = $strNombre;
$this->intNumeroHabitacion = $intNumeroHabitacion;
$this->strFechaEntrada = $strFechaEntrada;
$this->intPrecio = $intPrecio;
}
public function visualizaDatos(){
echo "
Nombre del reservante
| Número de habitación
| Fecha de Entrada
| Precio de la habitación
| Estado de la habitación
| Llave de la habitación
|
";
echo "
$this->strNombre |
$this->intNumeroHabitacion |
$this->strFechaEntrada |
$this->intPrecio |
$this->strEstadoHabitacion |
$this->strLlave |
";
}
public function setPrecio($intPrecio){
$this->intPrecio = $intPrecio;
}
public function getPrecio(){
return $this->intPrecio;
}
public function setNombre($strNombre){
$this->strNombre = $strNombre;
}
public function getNombre(){
return $this->strNombre;
}
public function setEstadoHabitacion($strEstado){
$this->strEstado = strtoupper($strEstado);
}
public function getEstadoHabitacion(){
return $this->strEstado;
}
public function cambiarFechaEntrada($strFechaEntrada, $intCargoAgregado){
$this->strFechaEntrada = $strFechaEntrada;
}
public function getFechaEntrada(){
return $this->strFechaEntrada;
}
public function setFechaSalida($strFechaSalida){
if(strcmp(getEstadoHabitacion(),"PAGADA") != 0){
$this->strFechaSalida = "HABITACION NO PAGADA";
}
else{
$this->strFechaSalida = $strFechaSalida;
}
}
public function getFechaSalida(){
return $this->strFechaSalida;
}
public function realizarCargo($intCargoAgregado){
$this->intTotalCargos += $intCargoAgregado;
}
public function getTotalDeCargos(){
return $this->intTotalCargos;
}
public function setLlave($strLlave){
$this->strLlave = $strLlave;
}
public function getLlave(){
return $this->strLlave;
}
public function getEstadoPago($intNumeroTarjeta){
$this->intTotalCargos *= .8;
echo "Validando forma de pago";
echo "Total a pagar:".$this->intTotalCargos;
echo "Descuento: 20%";
echo "Pago realizado";
setEstadoHabitacion("Pagada");
return $this->strEstadoHabitacion;
}
public function cargarServicio($strServicio){
$this->listaServicios->push($strServicio);
}
public function verServiciosCargados(){
echo "
";
for ($this->listaServicios->rewind(); $this->listaServicios->valid(); $this->listaServicios->next()) {
echo "";
echo "Nombre del servicio";
echo " | ";
}
echo " Total del costo de servicios | ";
echo "
";
echo "";
$this->listaServicios->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($this->listaServicios->rewind(); $this->listaServicios->valid(); $this->listaServicios->next()) {
echo "";
echo $this->listaServicios->current();
echo " | ";
}
echo "";
echo $this->intTotalCargos;
echo " | ";
echo "
";
}
public function cargarProducto($strProducto){
$this->listaProductos->push($strProducto);
}
public function verProductosCargados(){
echo "
";
for ($this->listaProductos->rewind(); $this->listaProductos->valid(); $this->listaProductos->next()) {
echo "";
echo "Nombre del producto";
echo " | ";
}
echo " Total del costo de los productos | ";
echo "
";
echo "";
$this->listaProductos->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($this->listaProductos->rewind(); $this->listaProductos->valid(); $this->listaProductos->next()) {
echo "";
echo $this->listaProductos->current();
echo " | ";
}
echo "";
echo $this->intTotalCargos;
echo " | ";
echo "
";
}
}
Caso de estudio dedicado al patrón de diseño Abstract Factory, en el cual el cliente puede crear diversos objetos concretos para distintos tipos de habitaciones.
Cabe destacar que en primera instancia se buscó un enfoque de A.F. con Master-Slave, sin embargo, el enfoque inicial que se tenía era el incorrecto, aunque la idea de tener un maestro esclavo para nuestras fabricas concretas no se descartó totalmente, ya que durante la implementación pude constatar que cada habitación podía ser muy dependiente de diversos servicios. Algunos de ellos eran comunes independientemente del tipo de habitación mientras que otros eran exclusivos de acuerdo al enfoque de las mismas.
Comments (0)