Introducció

El patró de disseny Facade és un patró estructural que proporciona una interfície simplificada a un conjunt de subsistemes complexos. Aquest patró és especialment útil quan es vol reduir la complexitat i dependència en un sistema, oferint una interfície única que encapsula la funcionalitat de diversos mòduls o classes.

Objectius del Patró Facade

  • Simplificar l'ús d'un sistema complex.
  • Reduir la dependència entre els clients i els subsistemes.
  • Proporcionar una interfície única i coherent.

Conceptes Clau

  1. Facade: La classe que proporciona una interfície simplificada als subsistemes.
  2. Subsistemes: Les classes o mòduls complexos que realitzen el treball real.

Diagrama UML

+-----------------+
|     Client      |
+-----------------+
        |
        v
+-----------------+
|     Facade      |
+-----------------+
| +operation()    |
+-----------------+
        |
        v
+-----------------+    +-----------------+
| Subsystem1      |    | Subsystem2      |
+-----------------+    +-----------------+
| +operation1()   |    | +operation2()   |
+-----------------+    +-----------------+

Exemple Pràctic

Escenari

Suposem que estem desenvolupant un sistema de cinema que inclou diversos subsistemes com la gestió de la pantalla, el so i la il·luminació. Volem proporcionar una interfície simplificada per als usuaris que vulguin iniciar una pel·lícula.

Implementació

Subsistemes

// Subsystem1: Screen
public class Screen {
    public void lower() {
        System.out.println("Lowering the screen.");
    }

    public void raise() {
        System.out.println("Raising the screen.");
    }
}

// Subsystem2: Sound
public class Sound {
    public void turnOn() {
        System.out.println("Turning on the sound system.");
    }

    public void turnOff() {
        System.out.println("Turning off the sound system.");
    }
}

// Subsystem3: Lights
public class Lights {
    public void dim() {
        System.out.println("Dimming the lights.");
    }

    public void brighten() {
        System.out.println("Brightening the lights.");
    }
}

Facade

public class HomeTheaterFacade {
    private Screen screen;
    private Sound sound;
    private Lights lights;

    public HomeTheaterFacade(Screen screen, Sound sound, Lights lights) {
        this.screen = screen;
        this.sound = sound;
        this.lights = lights;
    }

    public void watchMovie() {
        System.out.println("Get ready to watch a movie...");
        screen.lower();
        sound.turnOn();
        lights.dim();
        System.out.println("Movie is starting!");
    }

    public void endMovie() {
        System.out.println("Shutting down the movie theater...");
        screen.raise();
        sound.turnOff();
        lights.brighten();
        System.out.println("Movie theater is off.");
    }
}

Client

public class Client {
    public static void main(String[] args) {
        Screen screen = new Screen();
        Sound sound = new Sound();
        Lights lights = new Lights();

        HomeTheaterFacade homeTheater = new HomeTheaterFacade(screen, sound, lights);

        homeTheater.watchMovie();
        homeTheater.endMovie();
    }
}

Explicació del Codi

  1. Subsistemes: Les classes Screen, Sound i Lights representen els subsistemes del nostre sistema de cinema.
  2. Facade: La classe HomeTheaterFacade encapsula la funcionalitat dels subsistemes i proporciona una interfície simplificada per iniciar i finalitzar una pel·lícula.
  3. Client: La classe Client utilitza la interfície simplificada proporcionada per HomeTheaterFacade per interactuar amb el sistema de cinema.

Exercici Pràctic

Enunciat

Crea un sistema de control de casa intel·ligent que inclogui els següents subsistemes:

  • Seguretat: Activar i desactivar el sistema de seguretat.
  • Climatització: Encendre i apagar el sistema de climatització.
  • Il·luminació: Encendre i apagar les llums.

Implementa una classe Facade que proporcioni una interfície simplificada per activar i desactivar tots els sistemes de la casa intel·ligent.

Solució

Subsistemes

// Subsystem1: Security
public class Security {
    public void activate() {
        System.out.println("Activating security system.");
    }

    public void deactivate() {
        System.out.println("Deactivating security system.");
    }
}

// Subsystem2: ClimateControl
public class ClimateControl {
    public void turnOn() {
        System.out.println("Turning on climate control.");
    }

    public void turnOff() {
        System.out.println("Turning off climate control.");
    }
}

// Subsystem3: Lights
public class Lights {
    public void turnOn() {
        System.out.println("Turning on the lights.");
    }

    public void turnOff() {
        System.out.println("Turning off the lights.");
    }
}

Facade

public class SmartHomeFacade {
    private Security security;
    private ClimateControl climateControl;
    private Lights lights;

    public SmartHomeFacade(Security security, ClimateControl climateControl, Lights lights) {
        this.security = security;
        this.climateControl = climateControl;
        this.lights = lights;
    }

    public void activateAll() {
        System.out.println("Activating all systems...");
        security.activate();
        climateControl.turnOn();
        lights.turnOn();
        System.out.println("All systems are activated.");
    }

    public void deactivateAll() {
        System.out.println("Deactivating all systems...");
        security.deactivate();
        climateControl.turnOff();
        lights.turnOff();
        System.out.println("All systems are deactivated.");
    }
}

Client

public class Client {
    public static void main(String[] args) {
        Security security = new Security();
        ClimateControl climateControl = new ClimateControl();
        Lights lights = new Lights();

        SmartHomeFacade smartHome = new SmartHomeFacade(security, climateControl, lights);

        smartHome.activateAll();
        smartHome.deactivateAll();
    }
}

Resum

El patró Facade és una eina poderosa per simplificar la interacció amb sistemes complexos, proporcionant una interfície única i coherent. Aquest patró ajuda a reduir la dependència entre els clients i els subsistemes, millorant la mantenibilitat i la llegibilitat del codi.

© Copyright 2024. Tots els drets reservats