Patronul fațadă (sau modelul fațadă) este un model de proiectare software utilizat în mod obișnuit în programarea orientată pe obiecte. Numele este prin analogie cu o fațadă arhitecturală.
O fațadă este un obiect care oferă o interfață simplificată către un corp mai mare de cod, cum ar fi o bibliotecă de clase. O fațadă poate:
- face ca o bibliotecă software să fie mai ușor de utilizat, de înțeles și de testat, deoarece fațada are metode convenabile pentru sarcini comune;
- face biblioteca mai ușor de citit, din același motiv;
- reduce dependențele codului extern de funcționarea internă a unei biblioteci, deoarece majoritatea codului utilizează fațada, permițând astfel o mai mare flexibilitate în dezvoltarea sistemului;
- înfășoară o colecție de API-uri slab proiectate cu o singură API bine proiectată.
Patronul de proiectare Facade este adesea utilizat atunci când un sistem este foarte complex sau dificil de înțeles, deoarece sistemul are un număr mare de clase interdependente sau codul său sursă nu este disponibil. Acest model ascunde complexitatea sistemului mai mare și oferă o interfață mai simplă pentru client. Acesta implică, de obicei, o singură clasă wrapper care conține un set de membri necesari pentru client. Acești membri accesează sistemul în numele clientului de fațadă și ascund detaliile de implementare.
Utilizare
O fațadă este utilizată atunci când se dorește o interfață mai ușoară sau mai simplă cu un obiect de bază. Alternativ, un adaptor poate fi utilizat atunci când învelișul trebuie să respecte o anumită interfață și trebuie să suporte un comportament polimorfic. Un decorator face posibilă adăugarea sau modificarea comportamentului unei interfețe în timpul execuției.
Pattern | Intent |
---|---|
Adapter | Convertește o interfață în alta astfel încât aceasta să corespundă cu ceea ce așteaptă clientul |
Decorator | Adăugă dinamic responsabilitate interfeței prin învelirea codului original |
Facade | Furnizează o interfață simplificată |
Patronul de fațadă este utilizat de obicei atunci când:
- este necesară o interfață simplă pentru a accesa un sistem complex;
- abstracțiunile și implementările unui subsistem sunt strâns cuplate;
- este nevoie de un punct de intrare la fiecare nivel de software stratificat; sau
- un sistem este foarte complex sau dificil de înțeles.
Structura
Fațadă: Clasa de fațadă abstractizează pachetele 1, 2 și 3 de restul aplicației.clienți: Obiectele folosesc Modelul Fațadă pentru a accesa resursele din Pachete.
Exemplu
Acesta este un exemplu abstract al modului în care un client („tu”) interacționează cu o fațadă (calculatorul”) cu un sistem complex (părțile interne ale calculatorului, cum ar fi CPU și 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();
.