web-dev-qa-db-fra.com

Quel est le modèle de conception de façade?

façade est-il une classe qui contient beaucoup d’autres classes?

Qu'est-ce qui en fait un motif? Pour moi, c'est comme une classe normale.

Pouvez-vous m'expliquer ce schéma Façade?

181
kevin

Un modèle de conception est un moyen courant de résoudre un problème récurrent. Les classes dans tous les modèles de conception ne sont que des classes normales. Ce qui est important, c'est leur structure et leur collaboration pour résoudre le problème de la meilleure façon possible.

Le modèle de conception de façade simplifie l'interface avec un système complexe; car il est généralement composé de toutes les classes qui constituent les sous-systèmes du système complexe.

Une façade protège l'utilisateur des détails complexes du système et lui fournit un simplified view qui est easy to use. Il contient également decouples le code qui utilise le système à partir des détails des sous-systèmes, ce qui facilite la modification du système ultérieurement.

http://www.dofactory.com/Patterns/PatternFacade.aspx

http://www.blackwasp.co.uk/Facade.aspx

En outre, ce qui est important lors de l’apprentissage des motifs de conception, c’est de pouvoir reconnaître celui qui correspond à votre problème et de l’utiliser ensuite. Il est très courant d'abuser d'un modèle ou de tenter de l'adapter à un problème simplement parce que vous le connaissez. Soyez conscient de ces pièges tout en apprenant à utiliser des modèles de conception.

179

Wikipedia a un excellent exemple de motif de façade.

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}
92
Erdem Gezer

Comme expliqué dans la réponse précédente, il fournit une interface simple au client consommateur. Par exemple: "watch ESPN" est la fonction souhaitée. Mais cela implique plusieurs étapes telles que:

  1. Allumez la télévision si nécessaire;
  2. Vérifiez le fonctionnement du satellite/câble;
  3. Basculez sur ESPN si nécessaire.

Mais la façade simplifiera cela et fournira simplement la fonction "regarder ESPN" au client.

40
Aravind

Façade masque les complexités du système et fournit au client une interface à partir de laquelle le client peut accéder au système.

public class Inventory {
public String checkInventory(String OrderId) {
    return "Inventory checked";
}
}

public class Payment {
public String deductPayment(String orderID) {
    return "Payment deducted successfully";
}
}


public class OrderFacade {
private Payment pymt = new Payment();
private Inventory inventry = new Inventory();

public void placeOrder(String orderId) {
    String step1 = inventry.checkInventory(orderId);
    String step2 = pymt.deductPayment(orderId);
    System.out
            .println("Following steps completed:" + step1
                    + " & " + step2);
   }
}

public class Client {
       public static void main(String args[]){
         OrderFacade orderFacade = new OrderFacade();
         orderFacade.placeOrder("OR123456");
         System.out.println("Order processing completed");
       }
  }
28
KaviK

Une explication courte et simple:

  • Le motif de façade fournit une interface unifiée à un ensemble d'interfaces d'un sous-système.
  • Facade définit une interface de niveau supérieur qui facilite l'utilisation du sous-système.

Essayez de comprendre le scénario avec et sans façade:
Si vous souhaitez transférer l’argent de accout1 à account2, les deux sous-systèmes à appeler sont les suivants: retirer de compte1 et déposer sur compte2.

with and without facade

15
Arun Raaj

Une façade ne doit pas être décrite comme une classe contenant beaucoup d'autres classes. Il s’agit en fait d’une interface avec ces classes et devrait en faciliter l’utilisation, sinon la classe de façade est inutile.

10
llMll

En ce qui concerne vos questions:

Facade est-il une classe qui contient beaucoup d'autres classes?

Oui. C'est un wrapper pour de nombreux sous-systèmes en application.

Qu'est-ce qui en fait un motif? Pour moi, c'est comme une classe normale

Tous les modèles de conception sont aussi des classes normales. @ Unmesh Kondolikar a répondu correctement à cette requête.

Pouvez-vous m'expliquer à propos de cette façade, je suis nouveau pour concevoir des modèles.

Selon GoF, Facade le modèle de conception est défini comme:

Fournit une interface unifiée à un ensemble d'interfaces d'un sous-système. Le motif de façade définit une interface de niveau supérieur facilitant l'utilisation du sous-système .

Le modèle Façade est généralement utilisé lorsque:

  1. Une interface simple est nécessaire pour accéder à un système complexe.
  2. Les abstractions et les implémentations d'un sous-système sont étroitement couplées.
  3. Besoin d'un point d'entrée à chaque niveau de logiciel en couches.
  4. Le système est très complexe ou difficile à comprendre.

Prenons un exemple Word réel de site Web cleartrip .

Ce site propose des options pour réserver

  1. Vols
  2. Hôtels
  3. Vols + Hôtels

Extrait de code:

import Java.util.*;

public class TravelFacade{
    FlightBooking flightBooking;
    TrainBooking trainBooking;
    HotelBooking hotelBooking;

    enum BookingType {
        Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel;
    }; 

    public TravelFacade(){
        flightBooking = new FlightBooking();
        trainBooking = new TrainBooking();
        hotelBooking = new HotelBooking();        
    }
    public void book(BookingType type, BookingInfo info){
        switch(type){
            case Flight:
                // book flight;
                flightBooking.bookFlight(info);
                return;
            case Hotel:
                // book hotel;
                hotelBooking.bookHotel(info);
                return;
            case Train:
                // book Train;
                trainBooking.bookTrain(info);
                return;
            case Flight_And_Hotel:
                // book Flight and Hotel
                flightBooking.bookFlight(info);
                hotelBooking.bookHotel(info);
                return;
             case Train_And_Hotel:
                // book Train and Hotel
                trainBooking.bookTrain(info);
                hotelBooking.bookHotel(info);
                return;                
        }
    }
}
class BookingInfo{
    String source;
    String destination;
    Date    fromDate;
    Date     toDate;
    List<PersonInfo> list;
}
class PersonInfo{
    String name;
    int       age;
    Address address;
}
class Address{

}
class FlightBooking{
    public FlightBooking(){

    }
    public void bookFlight(BookingInfo info){

    }
}
class HotelBooking{
    public HotelBooking(){

    }
    public void bookHotel(BookingInfo info){

    }
}
class TrainBooking{
    public TrainBooking(){

    }
    public void bookTrain(BookingInfo info){

    }
}

Explication:

  1. FlightBooking, TrainBooking and HotelBooking sont différents sous-systèmes d'un grand système: TravelFacade

  2. TravelFacade offre une interface simple pour réserver l'une des options ci-dessous

    Flight Booking
    Train Booking 
    Hotel Booking
    Flight + Hotel booking 
    Train + Hotel booking
    
  3. book API de TravelFacade appelle en interne en dessous des API de sous-systèmes

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. De cette manière, TravelFacade fournit des API plus simples et plus simples sans exposer les API de sous-système.

Points à retenir: (de journaldev article de Pankaj Kumar )

  1. Le motif de façade ressemble plus à un assistant == pour les applications clientes
  2. Le motif de façade peut être appliqué à n’importe quel stade du développement, généralement lorsque le nombre d’interfaces croît et que le système se complète x .
  3. Les interfaces de sous-système ne connaissent pas Facade et elles ne doivent pas avoir de référence de l’interface Facade
  4. Le motif de façade doit être appliqué à un type d'interface similaire , son objectif est de fournir une interface unique plutôt que de multiples interfaces faisant le même type. des emplois

Jetez un coup d'œil à source article également pour une meilleure compréhension.

7
Ravindra babu

Une autre utilisation du motif de façade pourrait être de réduire la courbe d’apprentissage de votre équipe. Laisse moi te donner un exemple:

Supposons que votre application doit interagir avec MS Excel en utilisant le modèle d'objet COM fourni par Excel. Un des membres de votre équipe connaît toutes les API Excel et crée une façade sur celle-ci, qui remplit tous les scénarios de base de l'application. Aucun autre membre de l'équipe n'a besoin de passer du temps à apprendre les API Excel. L'équipe peut utiliser la façade sans connaître les éléments internes ni tous les objets MS Excel impliqués dans la réalisation d'un scénario. N'est-ce pas génial?

Ainsi, il fournit une interface simplifiée et unifiée au-dessus d’un sous-système complexe.

6
Anand Patel

Le motif de façade encapsule de nombreuses autres interfaces afin de produire une interface plus simple.

Les modèles de conception sont utiles car ils résolvent des problèmes récurrents et, en général, simplifient le code. Dans une équipe de développeurs qui acceptent d'utiliser les mêmes modèles, cela améliore l'efficacité et la compréhension lors de la maintenance du code de chacun.

Essayez de lire sur plus de modèles:

Motif de façade: http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

ou plus généralement: http://www.dofactory.com/Patterns/Patterns.aspx

6
Aim Kai

Une façade expose des fonctions simplifiées généralement appelées et l'implémentation dissimule la complexité à laquelle les clients devraient normalement faire face. En général, l’implémentation utilise plusieurs packages, classes et fonctions. Les façades bien écrites rendent rare l’accès direct à d’autres classes. Par exemple, lorsque je visite un guichet automatique et que je retire un montant. Le guichet automatique cache qu’il s’agisse directement de la banque à laquelle appartient le client ou d’un réseau négocié pour une banque externe. Le guichet automatique fonctionne comme une façade consommant plusieurs périphériques et sous-systèmes qu’en tant que client, je n’ai pas à traiter directement avec lui.

5
ManojPatra

Facade explique comment encapsuler un sous-système complexe dans un seul objet d'interface. Cela réduit la courbe d'apprentissage nécessaire pour exploiter efficacement le sous-système. Il favorise également le découplage du sous-système de ses nombreux clients potentiels. D'autre part, si la façade est le seul point d'accès pour le sous-système, elle limitera les fonctionnalités et la flexibilité dont les "utilisateurs expérimentés" peuvent avoir besoin.

Source: https://sourcemaking.com/design_patterns/facade

4
user6102894

Il existe un très bon exemple réel du modèle - Le démarreur de voiture.

En tant que conducteurs, nous allumons la clé et la voiture démarre. Aussi simple que possible. En coulisse, de nombreux autres systèmes de la voiture sont impliqués (batterie, moteur, carburant, etc.) pour que la voiture puisse démarrer avec succès, mais ils sont cachés derrière le démarreur.

Comme vous pouvez le constater, le démarreur est la façade. Il nous donne une interface facile à utiliser, sans vous soucier de la complexité de tous les autres systèmes de voiture.

Résumons:

Le motif Facade simplifie et masque la complexité des blocs de code volumineux ou des API, offrant une interface plus propre, compréhensible et facile à utiliser.

4
Jordan Enev

Une façade est une classe dont le niveau de fonctionnalité se situe entre une boîte à outils et une application complète, offrant une utilisation simplifiée des classes d’un package ou d’un sous-système. Le motif Façade a pour objectif de fournir une interface facilitant l’utilisation d’un sous-système. - Extrait de livre Modèles de conception en C #.

4
Sean Hunter

Autre exemple de façade: votre application se connecte à la base de données et affiche les résultats sur l'interface utilisateur. Vous pouvez utiliser façade pour rendre votre application configurable, comme dans une base de données ou avec des objets fantaisie. Vous ferez donc tous les appels de base de données à la classe de façade, où elle lira config app et décidera de lancer la requête de base de données ou de renvoyer l'objet fictif. De cette façon, l'application devient indépendante de la base de données si la base de données n'est pas disponible.

4
aishu

Un modèle de conception est une solution générale réutilisable à un problème courant dans un contexte donné de la conception de logiciels.

Le modèle de conception de façade est un modèle structurel car il définit une manière de créer des relations entre des classes ou des entités. Le modèle de conception de façade est utilisé pour définir une interface simplifiée vers un sous-système plus complexe.

Le motif de façade est idéal lorsque vous travaillez avec un grand nombre de classes interdépendantes ou avec des classes nécessitant l'utilisation de plusieurs méthodes, en particulier lorsqu'elles sont compliquées à utiliser ou difficiles à comprendre. La classe façade est un "wrapper" qui contient un ensemble de membres faciles à comprendre et simples à utiliser. Ces membres accèdent au sous-système pour le compte de l'utilisateur de la façade, masquant ainsi les détails de la mise en œuvre.

Le modèle de conception de façade est particulièrement utile pour le wrapping de sous-systèmes mal conçus mais qui ne peuvent pas être refactorisés car le code source n'est pas disponible ou l'interface existante est largement utilisée. Parfois, vous pouvez décider de mettre en œuvre plusieurs façades pour fournir des sous-ensembles de fonctionnalités à des fins différentes.

Un exemple d'utilisation du modèle de façade est l'intégration d'un site Web à une application métier. Le logiciel existant peut inclure une grande quantité de logique métier à laquelle il faut accéder de manière particulière. Le site Web peut ne nécessiter qu'un accès limité à cette logique métier. Par exemple, le site Web devra peut-être indiquer si un article en vente a atteint un niveau de stock limité. La méthode IsLowStock de la classe facade peut renvoyer une valeur booléenne pour l'indiquer. En coulisse, cette méthode pourrait masquer les complexités du traitement du stock physique actuel, du stock entrant, des articles alloués et du faible niveau de stock de chaque article.

3
Program-Me-Rev

Sa simplement créer un wrapper pour appeler plusieurs méthodes. Vous avez une classe A avec la méthode x() et y() et la classe B avec la méthode k() et z (). Vous voulez appeler x, y, z en même temps. Pour ce faire, en utilisant un motif de façade, vous créez simplement une classe de façade et une méthode qui permet de dire xyz (). Au lieu d'appeler chaque méthode (x, y et z) individuellement, vous appelez simplement la méthode wrapper (xyz ()) de la classe de façade qui appelle ces méthodes.

Un modèle similaire est référentiel, mais il concerne principalement la couche d’accès aux données.

2
Jeff Schreib

Tous les modèles de conception sont des classes agencées d'une manière ou d'une autre qui convient à une application spécifique. Le motif de façade a pour objectif de masquer la complexité d’une opération ou de plusieurs opérations. Vous pouvez voir un exemple et apprendre le motif de façade de http://preciselyconcise.com/design_patterns/facade.php

2
Sai Sunder

Le modèle de conception de façade est compris dans le modèle de conception structurelle. En bref, façade signifie l'apparence extérieure. Cela signifie que, dans le modèle de conception de façade, nous cachons quelque chose et ne montrons que ce que le client exige réellement. En savoir plus sur le blog ci-dessous: http://www.sharepointcafe.net/2017/03/facade-design-pattern-in-aspdotnet.html

1
user1694660

Il s’agit d’un système d’autorégulation à guichet unique. Vous affectez tout travail qu’il déléguera à une méthode particulière dans une autre classe.

1
Saurabh

Le modèle de façade fournit une interface unifiée au groupe d'interfaces du sous-système. La façade définit une interface de haut niveau, ce qui simplifie le travail avec le sous-système.

1
Taras Melnyk