diff --git a/ARQUITECTURA_EJEMPLO/src/com/arquitectura/Main.java b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/Main.java new file mode 100644 index 0000000..bdf5073 --- /dev/null +++ b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/Main.java @@ -0,0 +1,33 @@ +package com.arquitectura; + +import com.arquitectura.model.User; +import com.arquitectura.repository.UserRepository; +import com.arquitectura.service.UserService; +import com.arquitectura.ui.UserController; +import java.util.Optional; + +public class Main { + public static void main(String[] args) throws InterruptedException { + // Implementación Mock del repositorio (Principio de Inversión de Dependencias) + UserRepository mockRepo = new UserRepository() { + @Override + public Optional findById(int id) { return Optional.empty(); } + @Override + public void save(User user) { + System.out.println("[DB] Guardado en base de datos: " + user.getName()); + } + }; + + UserService userService = new UserService(mockRepo); + UserController controller = new UserController(userService); + + // Simulamos la interacción de la UI + controller.onSaveButtonClicked(1, "Jules"); + + System.out.println("[Main] El hilo principal sigue libre y responsivo."); + + // Esperamos un poco para ver el resultado del hilo secundario + Thread.sleep(3000); + controller.shutdown(); + } +} diff --git a/ARQUITECTURA_EJEMPLO/src/com/arquitectura/model/User.java b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/model/User.java new file mode 100644 index 0000000..d901350 --- /dev/null +++ b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/model/User.java @@ -0,0 +1,14 @@ +package com.arquitectura.model; + +public class User { + private final int id; + private final String name; + + public User(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { return id; } + public String getName() { return name; } +} diff --git a/ARQUITECTURA_EJEMPLO/src/com/arquitectura/repository/UserRepository.java b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/repository/UserRepository.java new file mode 100644 index 0000000..db7b5fc --- /dev/null +++ b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/repository/UserRepository.java @@ -0,0 +1,9 @@ +package com.arquitectura.repository; + +import com.arquitectura.model.User; +import java.util.Optional; + +public interface UserRepository { + Optional findById(int id); + void save(User user); +} diff --git a/ARQUITECTURA_EJEMPLO/src/com/arquitectura/service/UserService.java b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/service/UserService.java new file mode 100644 index 0000000..f5fec49 --- /dev/null +++ b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/service/UserService.java @@ -0,0 +1,26 @@ +package com.arquitectura.service; + +import com.arquitectura.model.User; +import com.arquitectura.repository.UserRepository; +import java.util.concurrent.locks.ReentrantLock; + +public class UserService { + private final UserRepository repository; + // Lock for critical sections if needed outside DB transactions + private final ReentrantLock lock = new ReentrantLock(); + + public UserService(UserRepository repository) { + this.repository = repository; + } + + public void updateUser(User user) { + // En un escenario real, aquí se manejaría la transacción (JDBC commit/rollback) + lock.lock(); + try { + System.out.println("[Service] Actualizando usuario: " + user.getName()); + repository.save(user); + } finally { + lock.unlock(); + } + } +} diff --git a/ARQUITECTURA_EJEMPLO/src/com/arquitectura/ui/UserController.java b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/ui/UserController.java new file mode 100644 index 0000000..2a82c09 --- /dev/null +++ b/ARQUITECTURA_EJEMPLO/src/com/arquitectura/ui/UserController.java @@ -0,0 +1,40 @@ +package com.arquitectura.ui; + +import com.arquitectura.model.User; +import com.arquitectura.service.UserService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class UserController { + private final UserService userService; + // Pool de hilos para tareas en segundo plano + private final ExecutorService executor = Executors.newFixedThreadPool(2); + + public UserController(UserService userService) { + this.userService = userService; + } + + public void onSaveButtonClicked(int id, String name) { + System.out.println("[UI] Botón pulsado. Iniciando tarea en segundo plano..."); + + // Ejecutamos la tarea en un hilo separado para no bloquear la UI + executor.submit(() -> { + try { + // Simulamos una operación costosa + Thread.sleep(2000); + User user = new User(id, name); + userService.updateUser(user); + + // En JavaFX usaríamos Platform.runLater() + // En Swing usaríamos SwingUtilities.invokeLater() + System.out.println("[UI] Tarea completada. UI actualizada."); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + } + + public void shutdown() { + executor.shutdown(); + } +} diff --git a/HolaMundo.java b/HolaMundo.java new file mode 100644 index 0000000..28ab962 --- /dev/null +++ b/HolaMundo.java @@ -0,0 +1,6 @@ +public class HolaMundo { + public static void main(String[] args) { + System.out.println("¡Hola! Bienvenido al editor de código."); + System.out.println("Este es un programa simple en Java."); + } +}