Skip to content

Instantly share code, notes, and snippets.

@MariaRamosOrtiz
Created April 24, 2024 23:49
Show Gist options
  • Save MariaRamosOrtiz/fdeec6781cad1c928a4866d543d875a9 to your computer and use it in GitHub Desktop.
Save MariaRamosOrtiz/fdeec6781cad1c928a4866d543d875a9 to your computer and use it in GitHub Desktop.
  • Combo 1: Interfaz y Extensión Abstract Factory + Bridge Uso: Separar la abstracción de la implementación y permitir configuraciones independientes de ambas.

using System;

namespace RemoteControlApp { // Abstract Factory: Interfaz para crear familias de productos relacionados public interface IFabricaDispositivos { IControlRemoto CrearControlRemoto(); IDevice CrearDispositivo(); }

// Concrete Factory 1: Crea productos que están relacionados por una variante específica
public class FabricaTv : IFabricaDispositivos
{
    public IControlRemoto CrearControlRemoto()
    {
        return new ControlRemotoBasico();
    }

    public IDevice CrearDispositivo()
    {
        return new Televisor();
    }
}

// Concrete Factory 2: Crea productos que están relacionados por una variante específica
public class FabricaRadio : IFabricaDispositivos
{
    public IControlRemoto CrearControlRemoto()
    {
        return new ControlRemotoAvanzado();
    }

    public IDevice CrearDispositivo()
    {
        return new Radio();
    }
}

// Abstract Product A: Interfaz para los objetos de producto
public interface IControlRemoto
{
    void EncenderApagar();
    void BajarVolumen();
    void SubirVolumen();
    void MostrarEstado();
}

// Abstract Product B: Interfaz para los objetos de producto
public interface IDevice
{
    bool EstaEncendido();
    void Encender();
    void Apagar();
    int ObtenerVolumen();
    void AjustarVolumen(int volumen);
}

// Concrete Product A1: Implementa la interfaz de producto A
public class ControlRemotoBasico : IControlRemoto
{
    protected IDevice _dispositivo;

    public ControlRemotoBasico()
    {
        _dispositivo = null;
    }

    public ControlRemotoBasico(IDevice dispositivo)
    {
        _dispositivo = dispositivo;
    }

    public virtual void EncenderApagar() // Marcar como virtual
    {
        if (_dispositivo != null)
        {
            if (_dispositivo.EstaEncendido())
                _dispositivo.Apagar();
            else
                _dispositivo.Encender();

            Console.WriteLine($"Energía {(_dispositivo.EstaEncendido() ? "ENCENDIDA" : "APAGADA")}");
        }
    }

    public void BajarVolumen()
    {
        if (_dispositivo != null)
        {
            int volumen = _dispositivo.ObtenerVolumen() - 10;
            _dispositivo.AjustarVolumen(volumen);
            Console.WriteLine($"Volumen: {volumen}");
        }
    }

    public void SubirVolumen()
    {
        if (_dispositivo != null)
        {
            int volumen = _dispositivo.ObtenerVolumen() + 10;
            _dispositivo.AjustarVolumen(volumen);
            Console.WriteLine($"Volumen: {volumen}");
        }
    }

    public void MostrarEstado()
    {
        if (_dispositivo != null)
        {
            Console.WriteLine($"Estado del dispositivo: Energía {(_dispositivo.EstaEncendido() ? "ENCENDIDA" : "APAGADA")}, Volumen: {_dispositivo.ObtenerVolumen()}");
        }
    }
}

// Concrete Product A2: Implementa la interfaz de producto A
public class ControlRemotoAvanzado : ControlRemotoBasico
{
    public override void EncenderApagar()
    {
        if (_dispositivo != null)
        {
            base.EncenderApagar();
            Console.WriteLine("Función avanzada: Algo más...");
        }
    }

    public void Silenciar()
    {
        if (_dispositivo != null)
        {
            _dispositivo.AjustarVolumen(0);
            Console.WriteLine("Silenciado");
        }
    }
}

// Concrete Product B1: Implementa la interfaz de producto B
public class Televisor : IDevice
{
    private bool _estaEncendido;
    private int _volumen;

    public Televisor()
    {
        _estaEncendido = false;
        _volumen = 50;
    }

    public bool EstaEncendido() => _estaEncendido;

    public void Encender() => _estaEncendido = true;

    public void Apagar() => _estaEncendido = false;

    public int ObtenerVolumen() => _volumen;

    public void AjustarVolumen(int volumen) => _volumen = volumen;
}

// Concrete Product B2: Implementa la interfaz de producto B
public class Radio : IDevice
{
    private bool _estaEncendido;
    private int _volumen;

    public Radio()
    {
        _estaEncendido = false;
        _volumen = 50;
    }

    public bool EstaEncendido() => _estaEncendido;

    public void Encender() => _estaEncendido = true;

    public void Apagar() => _estaEncendido = false;

    public int ObtenerVolumen() => _volumen;

    public void AjustarVolumen(int volumen) => _volumen = volumen;
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Bienvenido al control remoto");
        Console.WriteLine("Seleccione el dispositivo:");
        Console.WriteLine("1. Televisor");
        Console.WriteLine("2. Radio");

        int seleccion;
        while (!int.TryParse(Console.ReadLine(), out seleccion) || (seleccion != 1 && seleccion != 2))
        {
            Console.WriteLine("Selección inválida. Por favor, introduzca 1 para Televisor o 2 para Radio.");
        }

        IFabricaDispositivos fabricaDispositivos = null;

        if (seleccion == 1)
        {
            fabricaDispositivos = new FabricaTv();
        }
        else if (seleccion == 2)
        {
            fabricaDispositivos = new FabricaRadio();
        }

        if (fabricaDispositivos != null)
        {
            IControlRemoto controlRemoto = fabricaDispositivos.CrearControlRemoto();
            IDevice dispositivo = fabricaDispositivos.CrearDispositivo();

            while (true)
            {
                Console.WriteLine("\nMenú:");
                Console.WriteLine("1. Encender/Apagar");
                Console.WriteLine("2. Subir Volumen");
                Console.WriteLine("3. Bajar Volumen");
                Console.WriteLine("4. Mostrar Estado");
                Console.WriteLine("0. Salir");

                int opcion;
                while (!int.TryParse(Console.ReadLine(), out opcion) || (opcion < 0 || opcion > 4))
                {
                    Console.WriteLine("Entrada inválida. Por favor, ingrese una opción válida.");
                }

                if (opcion == 0)
                    break;

                switch (opcion)
                {
                    case 1:
                        controlRemoto.EncenderApagar();
                        break;
                    case 2:
                        controlRemoto.SubirVolumen();
                        break;
                    case 3:
                        controlRemoto.BajarVolumen();
                        break;
                    case 4:
                        controlRemoto.MostrarEstado();
                        break;
                    default:
                        break;
                }
            }
        }
        else
        {
            Console.WriteLine("Opción no válida. Saliendo del programa.");
        }
    }
}

}

https://www.loom.com/share/e6d00511b71f43e48c60220c62cba635?sid=4eb4ac92-12d6-43d4-87b4-ca038d01d464

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment