Facademønsteret (eller facademønsteret) er et softwaredesignmønster, der almindeligvis anvendes i objektorienteret programmering. Navnet er en analogi til en arkitektonisk facade.

En facade er et objekt, der giver en forenklet grænseflade til en større mængde kode, f.eks. et klassebibliotek. En facade kan:

  • gøre et softwarebibliotek lettere at bruge, forstå og teste, da facaden har praktiske metoder til almindelige opgaver;
  • gøre biblioteket mere læsbart af samme grund;
  • reducere eksterne koders afhængighed af det indre arbejde i et bibliotek, da det meste kode bruger facaden, hvilket giver større fleksibilitet i udviklingen af systemet;
  • indpakke en dårligt designet samling af API’er med et enkelt veldesignet API.

Facade-designmønsteret bruges ofte, når et system er meget komplekst eller svært at forstå, fordi systemet har et stort antal indbyrdes afhængige klasser, eller fordi dets kildekode ikke er tilgængelig. Dette mønster skjuler kompleksiteten i det større system og giver en enklere grænseflade til klienten. Det omfatter typisk en enkelt wrapper-klasse, som indeholder et sæt medlemmer, der er nødvendige for klienten. Disse medlemmer får adgang til systemet på vegne af facade-klienten og skjuler implementeringsdetaljerne.

Brug

En facade anvendes, når der ønskes en lettere eller enklere grænseflade til et underliggende objekt. Alternativt kan en adapter bruges, når wrapperen skal respektere en bestemt grænseflade og skal understøtte polymorf adfærd. En decorator gør det muligt at tilføje eller ændre adfærd for en grænseflade på køretid.

Mønster Intention
Adapter Konverterer en grænseflade til en anden, så den passer til det, klienten forventer
Dekorator Føjer dynamisk ansvar til grænsefladen ved at indpakke den oprindelige kode
Facade Giver en forenklet grænseflade

Facademønsteret bruges typisk, når:

  • en simpel grænseflade er nødvendig for at få adgang til et komplekst system;
  • abstraktionerne og implementeringerne af et delsystem er tæt koblet;
  • der er brug for et indgangspunkt til hvert niveau af lagdelt software; eller
  • et system er meget komplekst eller svært at forstå.

Struktur

Facade: Facade-klassen abstraherer pakker 1, 2 og 3 fra resten af applikationen.klienter:

Eksempel

Dette er et abstrakt eksempel på, hvordan en klient (“du”) interagerer med en facade (computeren) til et komplekst system (interne computerdele, som CPU og Harddisk).

/* 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();

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.