Het Facade Pattern (of façade patroon) is een software-ontwerppatroon dat vaak wordt gebruikt bij object-georiënteerd programmeren. De naam is naar analogie van een architectonische gevel.
Een gevel is een object dat een vereenvoudigde interface biedt aan een groter lichaam van code, zoals een klassebibliotheek. Een gevel kan:
- een softwarebibliotheek gemakkelijker te gebruiken, te begrijpen en te testen maken, omdat de façade handige methoden voor veelvoorkomende taken heeft;
- de bibliotheek leesbaarder maken, om dezelfde reden;
- afhankelijkheid van code van buitenaf van de innerlijke werking van een bibliotheek verminderen, omdat de meeste code de façade gebruikt, waardoor meer flexibiliteit in de ontwikkeling van het systeem mogelijk is;
- een slecht ontworpen verzameling API’s omwikkelen met een enkele goed ontworpen API.
Het Facade ontwerp patroon wordt vaak gebruikt wanneer een systeem is zeer complex of moeilijk te begrijpen omdat het systeem heeft een groot aantal van elkaar afhankelijke klassen of de broncode is niet beschikbaar. Dit patroon verbergt de complexiteit van het grotere systeem en biedt een eenvoudigere interface naar de client. Het gaat meestal om een enkele “wrapper class” die een aantal leden bevat die de client nodig heeft. Deze leden hebben toegang tot het systeem namens de façade client en verbergen de implementatie details.
Gebruik
Een façade wordt gebruikt wanneer een gemakkelijkere of eenvoudigere interface naar een onderliggend object gewenst is. Als alternatief kan een adapter worden gebruikt wanneer de wrapper een bepaalde interface moet respecteren en polymorf gedrag moet ondersteunen. Een decorator maakt het mogelijk om gedrag van een interface in run-time toe te voegen of te wijzigen.
Pattern | Intent |
---|---|
Adapter | Converteert de ene interface naar de andere zodat deze overeenkomt met wat de client verwacht |
Decorator | Dynamisch verantwoordelijkheid toevoegen aan de interface door de oorspronkelijke code te omhullen |
Facade | Voorziet in een vereenvoudigde interface |
Het facade-patroon wordt gewoonlijk gebruikt wanneer:
- een eenvoudige interface nodig is om toegang te krijgen tot een complex systeem;
- de abstracties en implementaties van een subsysteem strak gekoppeld zijn;
- een toegangspunt nodig hebben tot elk niveau van gelaagde software; of
- een systeem zeer complex of moeilijk te begrijpen is.
Structuur
Facade: De façadeklasse abstraheert de pakketten 1, 2 en 3 van de rest van de applicatie.Clients: De objecten gebruiken het Facade Pattern om toegang te krijgen tot bronnen van de Packages.
Example
Dit is een abstract voorbeeld van hoe een client (“jij”) interacteert met een facade (de “computer”) naar een complex systeem (interne computeronderdelen, zoals CPU en HardDrive).
/* Complex parts */class CPU { freeze() { /* code here */ } jump(position) { /* code here */ } execute() { /* code here */ }}class Memory { load(position, data) { /* code here */ }}class HardDrive { read(lba, size) { /* code here */ }}/* Facade */class ComputerFacade { constructor() { this.processor = new CPU(); this.ram = new Memory(); this.hd = new HardDrive(); } start() { this.processor.freeze(); this.ram.load(this.BOOT_ADDRESS, this.hd.read(this.BOOT_SECTOR, this.SECTOR_SIZE)); this.processor.jump(this.BOOT_ADDRESS); this.processor.execute(); }}/* Client */let computer = new ComputerFacade();computer.start();