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
,Sound
iLights
representen els subsistemes del nostre sistema de cinema. - Facade: La classe
HomeTheaterFacade
encapsula la funcionalitat dels subsistemes i proporciona una interfície simplificada per iniciar i finalitzar una pel·lícula. - Client: La classe
Client
utilitza la interfície simplificada proporcionada perHomeTheaterFacade
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.
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