Soluciones ejercicio 1

Validable.java

package interfaces;
 
 
public sealed interface Validable permits Documento, Imagen, Video {
	boolean isValid();
}
 

Documento.java

package interfaces;
 
public abstract non-sealed class Documento implements Validable {
 
	protected long size;
	
 
	public Documento(long size) {
		this.size = size;
	}
 
	public long getSize() {
		return size;
	}
 
	public void setSize(long size) {
		this.size = size;
	}
 
}
 

Imagen.java

package interfaces;
 
public abstract non-sealed class Imagen implements Validable {
	
	protected long width;
	protected long height;
 
	public long getWidth() {
		return width;
	}
 
	public long getHeight() {
		return height;
	}
 
	public void setWidth(long width) {
		this.width = width;
	}
 
	public void setHeight(long height) {
		this.height = height;
	}
 
	public Imagen(long width, long height) {
		this.width = width;
		this.height = height;
	}
 
}
 

Video.java

package interfaces;
 
public abstract non-sealed class Video implements Validable {
	
	protected int length;
 
	public Video(int length) {
		this.length = length;
	}
 
	public int getLength() {
		return length;
	}
 
	public void setLength(int length) {
		this.length = length;
	}
 
}
 

DocumentoPDF.java

package interfaces;
 
public class DocumentoPDF extends Documento {
 
	public DocumentoPDF(long size) {
		super(size);
	}
 
	@Override
	public boolean isValid() {
		return size >= 0 && size <= 1024*1024;
	}
 
}
 

ImagenJPG.java

package interfaces;
 
public class ImagenJPG extends Imagen {
 
	public ImagenJPG(long width, long height) {
		super(width, height);
		
	}
 
	// Imagen <= 5 Megapixels
	// 2,560×1,920 con aspect ratio 16:9
	
	@Override
	public boolean isValid() {
		return width*height <= 5_000_000;
	}
 
}
 

VideoMp4.java

package interfaces;
 
public class VideoMp4 extends Video {
 
	public VideoMp4(int length) {
		super(length);
	}
 
	@Override
	public boolean isValid() {
		return length > 0 && length < 5*60;
	}
	
 
}
 

ServicioValidacion.java

package interfaces;
 
public class ServicioValidacion {
	
	private Validable[] validables;
	private int cantidadValidables;
	
	public ServicioValidacion() {
		validables = new Validable[10];
		cantidadValidables = 0;
	}
	
	public ServicioValidacion(int length) {
		validables = new Validable[length];
		cantidadValidables = 0;
	}
	
	public ServicioValidacion(Validable[] array) {
		validables = array.clone();
		cantidadValidables = array.length;
	}
 
	public boolean validarTodos() {
		boolean resultado = true;
		for(int i = 0; i < cantidadValidables; i++) {
			resultado = resultado && validables[i].isValid();
		}
		return resultado;
	}
	
	public static boolean validar(Validable v) {
		return v.isValid();
	}
}
 

App.java

package interfaces;
 
public class App {
 
	public static void main(String[] args) {
 
		Documento d1 = new DocumentoPDF(12345l);
		Documento d2 = new DocumentoPDF(12345678912343l);
		
		Imagen im = new ImagenJPG(2500, 1900);
		
		Video v = new VideoMp4(123);
		
		Validable[] arr = {d1, d2, im, v};
		
		ServicioValidacion servicioValidacion =
				new ServicioValidacion(arr);
		
		if (servicioValidacion.validarTodos())
			System.out.println("Todos los ficheros son válidos");
		else
			System.out.println("Hay algún fichero que no es válido");
		
	}
 
}
 

Soluciones ejercicio 2

Vendible.java

public interface Vendible {
	 double getPrecio();
}

Producto.java

 
public class Producto implements Vendible {
	 private String nombre;
	 private String categoria;
	 private double precio;
 
	 public Producto(String nombre, String categoria, double precio) {
	     this.nombre = nombre;
	     this.categoria = categoria;
	     this.precio = precio;
	 }
 
	 @Override
	 public double getPrecio() {
	     return precio;
	 }
 
	public String getNombre() {
		return nombre;
	}
 
	public String getCategoria() {
		return categoria;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}
 
	public void setPrecio(double precio) {
		this.precio = precio;
	}
	 
	 
}
 

Servicio.java

 
public class Servicio implements Vendible {
	private String nombre;
	private String tipo;
	private int duracionMinutos;
 
	public Servicio(String nombre, String tipo, int duracionMinutos) {
		this.nombre = nombre;
		this.tipo = tipo;
		this.duracionMinutos = duracionMinutos;
	}
 
	@Override
	public double getPrecio() {
		double precioMinuto = switch (tipo) {
		case "PINTURA" -> 0.75;
		case "ELECTRICIDAD" -> 1.0;
		case "FONTANERÍA" -> 1.25;
		default -> 1.5;
		};
		return precioMinuto * duracionMinutos;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public String getTipo() {
		return tipo;
	}
 
	public int getDuracionMinutos() {
		return duracionMinutos;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public void setTipo(String tipo) {
		this.tipo = tipo;
	}
 
	public void setDuracionMinutos(int duracionMinutos) {
		this.duracionMinutos = duracionMinutos;
	}
	
	
 
}
 

Factura.java

package interfaces;
 
public class Factura {
	private String cliente;
	private Vendible[] elementos;
 
	public Factura(String cliente, Vendible[] elementos) {
		this.cliente = cliente;
		this.elementos = elementos;
	}
 
	public double calcularTotal() {
		double total = 0.0;
		for (Vendible vendible : elementos) {
			total += vendible.getPrecio();
		}
		return total;
	}
 
	public String getCliente() {
		return cliente;
	}
 
	public Vendible[] getElementos() {
		return elementos;
	}
 
	public void setCliente(String cliente) {
		this.cliente = cliente;
	}
 
	public void setElementos(Vendible[] elementos) {
		this.elementos = elementos;
	}
 
}
 

App.java

package interfaces;
 
public class App {
	 public static void main(String[] args) {
	     Producto producto1 = new Producto("Tornillo", "Ferretería", 0.5);
	     Producto producto2 = new Producto("Martillo", "Herramienta", 10.0);
	     Servicio servicio1 = new Servicio("Pintura de paredes", "PINTURA", 120);
	     Servicio servicio2 = new Servicio("Reparación eléctrica", "ELECTRICIDAD", 60);
 
	     Vendible[] elementos = {producto1, producto2, servicio1, servicio2};
 
	     Factura factura = new Factura("Cliente Ejemplo", elementos);
 
	     double total = factura.calcularTotal();
	     System.out.println("Total de la factura: " + total + "€");
	 }
 
	
}
 
 

Soluciones ejercicio 3

Fichero.java

public interface Fichero {
	
	String getNombre();
	
	String getFormato();
 
}
 

FicheroAbstracto.java

public abstract class FicheroAbstracto implements Fichero {
 
	protected String nombre;
	protected String formato;
	
	
	public FicheroAbstracto(String nombre, String formato) {
		this.nombre = nombre;
		this.formato = formato;
	}
 
	@Override
	public String getNombre() {
		return nombre;
	}
 
	@Override
	public String getFormato() {
		return formato;
	}
 
}
 

Reproducible.java

public interface Reproducible extends Fichero {
	
	void reproducir();
	
	int getDuracion();
	
 
}
 

FicheroPDF.java

public class FicheroPDF extends FicheroAbstracto {
 
	public FicheroPDF(String nombre) {
		super(nombre, "PDF");
	}
 
}

ImagenJPG.java

public class ImagenJPG extends FicheroAbstracto implements Reproducible {
 
	public ImagenJPG(String nombre) {
		super(nombre, "JPG");
	}
 
	@Override
	public void reproducir() {
		System.out.println("Mostrando la imagen JPG durante 7 segundos");
	}
 
	@Override
	public int getDuracion() {
		return 7;
	}
 
}

AudioMp3.java

public class AudioMp3 extends FicheroAbstracto implements Reproducible {
 
	private int duracion;
	
	public AudioMp3(String nombre, int duracion) {
		super(nombre, "MP3");
		this.duracion = duracion;
	}
 
	@Override
	public void reproducir() {
		System.out.println("Reproduciendo todo el contenido del fichero");
		
	}
 
	@Override
	public int getDuracion() {
		return duracion;
	}
 
}
 

VideoH264.java

public class VideoH264 extends FicheroAbstracto implements Reproducible {
 
	private int duracion;
	
	public VideoH264(String nombre, int duracion) {
		super(nombre, "H.264");
	}
 
	@Override
	public void reproducir() {
		System.out.println("Reproduciendo todo el contenido del vídeo");
		
	}
 
	@Override
	public int getDuracion() {
		return duracion;
	}
	
	
 
}

Reproductor.java

public interface Reproductor {
	
	void cargar(Reproducible r);
	
	void reproducir();
	
	default void reproducir(Reproducible r) {
		r.reproducir();
	}
	
	void parar();
	
	
 
}

ReproductorMultimedia.java

public class ReproductorMultimedia implements Reproductor{
	
	private Reproducible actual;
	private Reproducible[] lista;
	private int cantidadReproducibles;
	
	
	public ReproductorMultimedia() {
		cantidadReproducibles = 0;
	}
	
	public ReproductorMultimedia(Reproducible[] lista) {
		this.lista = lista;
		cantidadReproducibles = lista.length;
		actual = lista[0];
	}
	
 
	@Override
	public void cargar(Reproducible r) {
		actual = r;
		
	}
 
	@Override
	public void reproducir() {
		this.reproducir(actual);
		
	}
 
	@Override
	public void parar() {
		actual = null;	
	}
 
}
 

App.java

 
public class App {
 
	public static void main(String[] args) {
		
		
		VideoH264 v = new VideoH264("Avengers Endgame", 182*60);
		AudioMp3 a = new AudioMp3("19 Días y 500 noches - Joaquín Sabina", 277);
		ImagenJPG i = new ImagenJPG("foto vacaciones");
		FicheroPDF f = new FicheroPDF("Nomina");
		
		Reproductor r = new ReproductorMultimedia();
		
		r.cargar(v);
		r.reproducir();
		
		r.cargar(a);
		r.reproducir();
		
		r.cargar(i);
		r.reproducir();
		
		//r.cargar(f); // Error
 
	}
 
}
 

Soluciones ejercicio 4

Valorable.java

public interface Valorable {
	
	double getPuntuacionMedia();
 
}

Valoracion.java

public class Valoracion {
	
	private Usuario usuario;
	private Valorable valorable;
	private int puntuacion;
	
	
	public Valoracion(Usuario usuario, Valorable valorable, int puntuacion) {
		this.usuario = usuario;
		this.valorable = valorable;
		this.puntuacion = puntuacion;
	}
 
 
	public Usuario getUsuario() {
		return usuario;
	}
 
 
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
 
 
	public Valorable getValorable() {
		return valorable;
	}
 
 
	public void setValorable(Valorable valorable) {
		this.valorable = valorable;
	}
 
 
	public int getPuntuacion() {
		return puntuacion;
	}
 
 
	public void setPuntuacion(int puntuacion) {
		this.puntuacion = puntuacion;
	}	
 
}
 

Usuario.java

public class Usuario {
	
	private String username;
	private String email;
	private Valoracion[] valoraciones;
	private int cantidadValoraciones;
	
	
	public Usuario(String username) {
		this.username = username;
		cantidadValoraciones = 0;
		valoraciones = new Valoracion[10];
	}
	
	public Usuario(String username, String email) {
		this(username);
		this.email = email;
	}
	
	public void agregarValoracion(Valoracion valoracion) {
        if (cantidadValoraciones < valoraciones.length) {
            valoraciones[cantidadValoraciones] = valoracion;
            cantidadValoraciones++;
        } else {
            System.out.println("No se pueden agregar más valoraciones");
        }
    }
 
	public String getUsername() {
		return username;
	}
 
	public void setUsername(String username) {
		this.username = username;
	}
 
	public String getEmail() {
		return email;
	}
 
	public void setEmail(String email) {
		this.email = email;
	}
 
	public Valoracion[] getValoraciones() {
		return valoraciones.clone();
	}
 
	public int getCantidadValoraciones() {
		return cantidadValoraciones;
	}	
 
}
 

ValorableAbstracto.java

public class ValorableAbstracto implements Valorable {
	
	private Valoracion[] valoraciones;
	private int cantidadValoraciones;
	
	public ValorableAbstracto() {
		valoraciones = new Valoracion[10];
		cantidadValoraciones = 0;
	}
	
	public void agregarValoracion(Valoracion valoracion) {
        if (cantidadValoraciones < valoraciones.length) {
            valoraciones[cantidadValoraciones] = valoracion;
            cantidadValoraciones++;
        } else {
            System.out.println("No se pueden agregar más valoraciones");
        }
    }
	
 
	@Override
	public double getPuntuacionMedia() {
		double puntuacion = 0.0;
		for(int i = 0; i < cantidadValoraciones; i++)
			puntuacion += valoraciones[i].getPuntuacion();
		
		return puntuacion/cantidadValoraciones;
	}
 
}
 

ServicioValoracion.java

public class ServicioValoracion {
	
	public static void valorar(Usuario usuario, Valorable valorable, int puntuacion) {
        Valoracion valoracion = new Valoracion(usuario, valorable, puntuacion);
        usuario.agregarValoracion(valoracion);
        
        if (valorable instanceof ValorableAbstracto valorableAbstracto) {
            valorableAbstracto.agregarValoracion(valoracion);
        }
    }
 
}
 

Producto.java

public class Producto extends ValorableAbstracto {
	
	private String nombre, categoria;
	private double precio;
	
	
	public Producto(String nombre, String categoria, double precio) {
		super();
		this.nombre = nombre;
		this.categoria = categoria;
		this.precio = precio;
	}
 
 
	public String getNombre() {
		return nombre;
	}
 
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
 
	public String getCategoria() {
		return categoria;
	}
 
 
	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}
 
 
	public double getPrecio() {
		return precio;
	}
 
 
	public void setPrecio(double precio) {
		this.precio = precio;
	}
}
 

Negocio.java

public class Negocio extends ValorableAbstracto {
	
	private String nombre, ciudad;
 
	public Negocio(String nombre, String ciudad) {
		super();
		this.nombre = nombre;
		this.ciudad = ciudad;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
 
	public String getCiudad() {
		return ciudad;
	}
 
	public void setCiudad(String ciudad) {
		this.ciudad = ciudad;
	}
 
}
 

Ciudad.java

public class Ciudad extends ValorableAbstracto {
	
	private String nombre, pais;
 
	public Ciudad(String nombre, String pais) {
		super();
		this.nombre = nombre;
		this.pais = pais;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public String getPais() {
		return pais;
	}
 
	public void setPais(String pais) {
		this.pais = pais;
	}
	
	
 
}
 

App.java

public class App {
 
	public static void main(String[] args) {
        // Crear usuarios
        Usuario usuario1 = new Usuario("Usuario1");
        Usuario usuario2 = new Usuario("Usuario2");
 
        // Crear productos
        Producto producto1 = new Producto("Producto1", "Categoría1", 10.99);
        Producto producto2 = new Producto("Producto2", "Categoría2", 19.99);
 
        // Crear negocios
        Negocio negocio1 = new Negocio("Mi tienda", "Sevilla");
        Negocio negocio2 = new Negocio("El Gran Bazar", "Madrid");
       
        // Crear una ciudad
        Ciudad ciudad1 = new Ciudad("Sevilla", "España");
        
        // Valorar productos, negocios o ciudades
        ServicioValoracion.valorar(usuario1, producto1, 4);
        ServicioValoracion.valorar(usuario2, producto2, 3);
 
        ServicioValoracion.valorar(usuario1, negocio1, 3);
        ServicioValoracion.valorar(usuario2, negocio2, 4);
        
        ServicioValoracion.valorar(usuario1, ciudad1, 5);
        ServicioValoracion.valorar(usuario2, ciudad1, 4);
        
        
        // Imprimir la puntuación media de los productos, negocios y ciudades
        System.out.println("Puntuación media de " + producto1.getNombre() + ": " + producto1.getPuntuacionMedia());
        System.out.println("Puntuación media de " + producto2.getNombre() + ": " + producto2.getPuntuacionMedia());
        System.out.println("Puntuación media de " + negocio1.getNombre() + ": " + negocio1.getPuntuacionMedia());
        System.out.println("Puntuación media de " + negocio2.getNombre() + ": " + negocio2.getPuntuacionMedia());
        System.out.println("Puntuación media de " + ciudad1.getNombre() + ": " + ciudad1.getPuntuacionMedia());
    }
 
}