* Translate Iterator pattern to Spanish * Translate to Spanish: Servant pattern Sharding pattern Spatial-partition pattern Special-case pattern specification pattern State pattern Strategy pattern Subclass-case pattern * Update language to es * Fixing Missing translation * Translate to Spanish: template method pattern throttling pattern trampoline pattern transaction-script pattern type object pattern Update method pattern visitor pattern * Fixing Missing translation
title, category, language, tag
| title | category | language | tag | |
|---|---|---|---|---|
| Transaction Script | Behavioral | es |
|
Propósito
Transaction Script organiza la lógica de negocio por procedimientos donde cada procedimiento maneja una única solicitud de la presentación.
Explicación
Ejemplo del mundo real
Necesitas crear un sistema de reservas de habitaciones de hotel. Dado que los requisitos son bastante simples utilizar el patrón Transaction Script.
En palabras sencillas
Transaction Script organiza la lógica de negocio en transacciones que el sistema necesita llevar a cabo.
Ejemplo programático
La clase Hotel se encarga de reservar y cancelar las reservas de habitaciones.
@Slf4j
public class Hotel {
private final HotelDaoImpl hotelDao;
public Hotel(HotelDaoImpl hotelDao) {
this.hotelDao = hotelDao;
}
public void bookRoom(int roomNumber) throws Exception {
Optional<Room> room = hotelDao.getById(roomNumber);
if (room.isEmpty()) {
throw new Exception("Room number: " + roomNumber + " does not exist");
} else {
if (room.get().isBooked()) {
throw new Exception("Room already booked!");
} else {
Room updateRoomBooking = room.get();
updateRoomBooking.setBooked(true);
hotelDao.update(updateRoomBooking);
}
}
}
public void cancelRoomBooking(int roomNumber) throws Exception {
Optional<Room> room = hotelDao.getById(roomNumber);
if (room.isEmpty()) {
throw new Exception("Room number: " + roomNumber + " does not exist");
} else {
if (room.get().isBooked()) {
Room updateRoomBooking = room.get();
updateRoomBooking.setBooked(false);
int refundAmount = updateRoomBooking.getPrice();
hotelDao.update(updateRoomBooking);
LOGGER.info("Booking cancelled for room number: " + roomNumber);
LOGGER.info(refundAmount + " is refunded");
} else {
throw new Exception("No booking for the room exists");
}
}
}
}
La clase Hotel tiene dos métodos, uno para reservar y otro para cancelar una habitación respectivamente. Cada uno de ellos
transacción en el sistema, haciendo que Hotel implemente el patrón Transaction Script
Transaction Script.
El método bookRoom consolida todos los pasos necesarios como comprobar si la habitación ya está reservada
o no, si no está reservada entonces reserva la habitación y actualiza la base de datos utilizando el DAO.
El método cancelRoom consolida pasos como comprobar si la habitación está reservada o no,
si está reservada, calcula el importe del reembolso y actualiza la base de datos utilizando el DAO.
Diagrama de clases
Aplicabilidad
Utilice el patrón Transaction Script cuando la aplicación tenga sólo una pequeña cantidad de lógica y esa lógica no será extendida en el futuro.
Consecuencias
- A medida que la lógica de negocio se complica, se hace progresivamente más difícil mantener el script de transacción en un estado bien diseñado.
- Puede ocurrir duplicación de código entre scripts de transacciones.
- Normalmente no es fácil refactorizar el script de transacciones a otros patrones de lógica de dominio. del dominio.
Patrones relacionados
- Domain Model
- Table Module
- Service Layer
