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
- Facade: La classe que proporciona una interfície simplificada als subsistemes.
- 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
- Subsistemes: Les classes
Screen,SoundiLightsrepresenten els subsistemes del nostre sistema de cinema. - Facade: La classe
HomeTheaterFacadeencapsula la funcionalitat dels subsistemes i proporciona una interfície simplificada per iniciar i finalitzar una pel·lícula. - Client: La classe
Clientutilitza la interfície simplificada proporcionada perHomeTheaterFacadeper 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.
Curs de Patrons de Disseny de Programari
Mòdul 1: Introducció als Patrons de Disseny
- Què són els Patrons de Disseny?
- Història i Origen dels Patrons de Disseny
- Classificació dels Patrons de Disseny
- Avantatges i Desavantatges d'Usar Patrons de Disseny
Mòdul 2: Patrons Creacionals
Mòdul 3: Patrons Estructurals
Mòdul 4: Patrons de Comportament
- Introducció als Patrons de Comportament
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
Mòdul 5: Aplicació de Patrons de Disseny
- Com Seleccionar el Patró Adequat
- Exemples Pràctics d'Ús de Patrons
- Patrons de Disseny en Projectes Reals
- Refactorització Usant Patrons de Disseny
Mòdul 6: Patrons de Disseny Avançats
- Patrons de Disseny en Arquitectures Modernes
- Patrons de Disseny en Microserveis
- Patrons de Disseny en Sistemes Distribuïts
- Patrons de Disseny en Desenvolupament Àgil
