Table des matières
🎜Histoire🎜 🎜" >🎜Histoire🎜 🎜
🎜Présentation du mode façade🎜 🎜" >🎜Présentation du mode façade🎜 🎜
Diagramme UML en mode façade" >Diagramme UML en mode façade
Personnages en mode façade" >Personnages en mode façade
缺点" >缺点
大神们是如何使用的 " >大神们是如何使用的
Maison Java javaDidacticiel Je travaille depuis cinq ans et je ne comprends toujours pas le modèle de façade !

Je travaille depuis cinq ans et je ne comprends toujours pas le modèle de façade !

Aug 28, 2023 pm 03:11 PM
mode façade


D'accord, entrons dans notre thème. Aujourd'hui, je partage avec vous Mode façade门面模式用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式。

故事

开发的朋友都知道,后端开发通常都是:

controller---servie---dao/mapper/repository

但是,我问过很多人,熟悉门面模式不?有的工作五年了都不知道。

今天老田,就带你来看看门面模式。

门面模式概述

门面模式(Facade Pattern.

Raconté avec des histoires de vie appropriées et des scénarios de projet réels

Modèle de conception🎜, et enfin utilisez une phrase pour résumer ce modèle de conception. 🎜🎜

🎜Histoire🎜 🎜

🎜Les amis développeurs savent tous que le développement back-end est généralement : 🎜

controller---servie---dao/mapper/repository🎜

🎜 Cependant, je J'ai demandé à beaucoup de gens, connaissent-ils le modèle de façade ? Certaines personnes travaillent depuis cinq ans et ne le savent même pas. 🎜🎜Aujourd'hui, Lao Tian vous montrera le mode façade. 🎜

🎜Présentation du mode façade🎜 🎜

🎜Mode façade (Facade Pattern), également appelé mode d'apparence, fournit une interface unifiée pour accéder à l'interface d'un groupe de sous-systèmes. Sa principale caractéristique est qu'il définit une interface de haut niveau pour rendre le sous-système plus facile à utiliser et qu'il appartient au modèle de conception structurelle. 🎜🎜Anglais :🎜

Fournir une interface unifiée à un ensemble d'interfaces dans un sous-système. Facade définit une interface de niveau supérieur qui rend le sous-système plus facile à utiliser

En fait, dans notre travail de codage quotidien, nous utilisons tous le modèle de façade de manière intensive et intentionnelle. ou involontairement. Chaque fois qu'un module de haut niveau doit planifier plusieurs sous-systèmes (plus de 2 objets de classe), nous créerons consciemment une nouvelle classe pour encapsuler ces sous-systèmes et fournirons une interface simplifiée afin que les modules de haut niveau puissent plus facilement appeler indirectement les fonctions de ces sous-systèmes. sous-systèmes.

Cas dans la vie

Concernant le modèle de façade, il existe de nombreux cas dans la vie.

Cas 1 : Lorsque vous vous rendez à la banque pour gérer des affaires, il y a une réception pour vous recevoir. Ensuite, la réception vous demandera quelles affaires vous devez faire, et il vous les guidera une par une, afin que nous n'ayons pas besoin de nous promener et de chercher la fenêtre commerciale correspondante. Ce personnel de réception est équivalent au modèle de façade.

Cas 2 : Quand on construit une maison, s'il n'y a pas d'entrepreneur, alors il faut trouver des cimentiers, des électriciens, des décorateurs, etc. Mais si vous avez un entrepreneur, vous n’avez aucune de ces tâches à effectuer. Vous pouvez dire directement à l’entrepreneur que vous avez besoin d’un électricien pour réparer le câblage. Cet entrepreneur peut être compris comme un modèle de façade.

Cas 3 : controller,也可以理解为门面模式,比如说获取用户账户信息,先查UserService获取用户信息,然后查UserAccountServiceInformations du compte utilisateur développées par notre backend.

Scénarios applicables pour le mode façade

Dans les systèmes logiciels, le mode façade convient aux scénarios d'application suivants.

  • Fournir une interface simple pour l'accès externe à un module ou sous-système complexe.
  • Lorsque vous souhaitez améliorer l'indépendance des sous-systèmes.
  • Lorsqu'un sous-système peut avoir des bugs ou des problèmes liés aux performances en raison de raisons temporaires inévitables, une interface de haut niveau peut être fournie via le mode façade pour isoler l'interaction directe entre le client et le sous-système afin d'éviter la pollution du code.

Méthode d'écriture commune pour le mode façade

Il est préférable d'utiliser du code pour implémenter un mode façade simple, car ce que nous aimons le plus, c'est commencer par une démo.

Scénario métier : Vous devez maintenant appeler les méthodes respectives des trois services :

public class ServiceA {
    public void doA(){
        System.out.println("do ServiceA");
    }
}
public class ServiceB {
    public void doB(){
        System.out.println("do ServiceB");
    }
}

public class ServiceC {
    public void doC(){
        System.out.println("do ServiceC");
    }
}

Lorsque le mode façade n'est pas introduit, le client l'appelle ainsi :

public class Client {
    public static void main(String[] args) {
        ServiceA serviceA=new ServiceA();
        ServiceB serviceB=new ServiceB();
        ServiceC serviceC=new ServiceC();

        serviceA.doA();
        serviceB.doB();
        serviceC.doC();
    }
}

A chaque fois, le client doit créer beaucoup de objets de service. S'il y a de nombreux services impliqués, ce code ne serait-il pas gênant ? Il y aura beaucoup de code répétitif.

Résultat d'exécution

do ServiceA
do ServiceB
do ServiceC

Rejoignons-nous maintenant门面模式 :

public class Facade {
    //是不是很像我们controller里注入各种service?
    private ServiceA serviceA = new ServiceA();
    private ServiceB serviceB = new ServiceB();
    private ServiceC serviceC = new ServiceC();

    public void doA() {
        serviceA.doA();
    }

    public void doB() {
        serviceB.doB();
    }

    public void doC() {
        serviceC.doC();
    }
}

Le client devient :

public class Client {
    public static void main(String[] args) {
        //轻轻松松的搞定,只需要创建门面这个对象即可
        Facade facade=new Facade();
        facade.doA();
        facade.doB();
        facade.doC();
    }
}

Résultat d'exécution :

do ServiceA
do ServiceB
do ServiceC

Diagramme UML en mode façade


Je travaille depuis cinq ans et je ne comprends toujours pas le modèle de façade !

Combiné avec cet UML Dans ce diagramme, il est plus facile de comprendre le modèle de façade en examinant les cas du personnel de la réception des banques et des sous-traitants.

Personnages en mode façade

Comme vous pouvez le voir sur l'image ci-dessus, le mode façade contient principalement 2 personnages.

  • Caractère d'apparence (Façade) : Également appelé rôle de façade, il s’agit de l’interface externe unifiée du système. Facade):也叫作门面角色,是系统对外的统一接口。
  • 子系统角色(Service):可以同时有一个或多个Service。每个Service都不是一个单独的类,而是一个类的集合。Service们并不知道Facade的存在,对于Service们而言,Facade 只是另一个客户端而已(即FacadeServiceAServiceBServiceC
Rôle du sous-système (Service ) : Il peut y avoir un ou plusieurs Service</code >. Chaque<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05) ; font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">Service n'est pas une classe distincte, mais une collection de cours. Service que les gens ne connaissent pasL'existence de Façade, pour les Services, Facade n'est qu'un autre client (c'est-à-dire FaçadepaireServiceA, ServiceB, ServiceCtransparent).

Extension du motif de façade

Avantages

Quantity Réduire l'interdépendance des systèmes Pensez-y, si nous n'utilisons pas le mode façade, l'accès externe va directement dans le sous-système, et il existe une forte relation de couplage entre eux si vous mourez, je mourrai, et si vous vivez, je vivrai comme ça. Une forte dépendance est le résultat de la conception du système. Inacceptable, l'émergence du modèle de façade résout très bien ce problème. Toutes les dépendances concernent les objets de façade et n'ont rien à voir avec le sous-système. 🎜🎜Quantity Flexibilité améliorée La dépendance est réduite et la flexibilité est naturellement augmentée. Quelle que soit la manière dont le sous-système change en interne, tant que cela n'affecte pas l'objet de façade, vous pouvez vous déplacer librement. 🎜

● 提高安全性   想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到 。

缺点

  • 当增加子系统和扩展子系统行为时,可能容易带来未知风险。
  • 不符合开闭原则。
  • 某些情况下,可能违背单一职责原则

大神们是如何使用的

Spring中也是有大量使用到门面模式,比如说

org.springframework.jdbc.support.JdbcUtils

再来看看其中的方法

public static void closeConnection(@Nullable Connection con) {
    con.close();
}
public static Object extractDatabaseMetaData(DataSource dataSource, DatabaseMetaDataCallback action)
   throws MetaDataAccessException {
    Connection con = null;
  try {
   con = DataSourceUtils.getConnection(dataSource);
   DatabaseMetaData metaData = con.getMetaData();
   if (metaData == null) {
      //.....
   }
   return action.processMetaData(metaData);
  }
}
......

都是给我封装好了方法,对于我们开发者来说,我只面向JdbcUtils这一个类就好了,我不用去管ConnectionResultSet等是怎么创建的,需要的时候,我调用JdbcUtils的对应方法即可获得对应的对象。

Mybatis中也是用到了门面模式,比如:

org.apache.ibatis.session.Configuration

Configuration中以new开头的方法,比如:

public Executor newExecutor(Transaction transaction) {
    return newExecutor(transaction, defaultExecutorType);
}
public MetaObject newMetaObject(Object object) {
    return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
}

public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    ...
    return parameterHandler;
}

public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
      ResultHandler resultHandler, BoundSql boundSql) {
   ...
    return resultSetHandler;
}

public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement){
   ...
}

对于调用这些方法的地方,他并不知道是怎么new出来的对象,只管使用就行了。

Tomcat中也有门面模式,比如:

org.apache.catalina.connector.RequestFacade

从名字就知道它用了门面模式。它封装了非常多的request操作,也整合了很多servlet-api以外的内容,给用户使用提供了很大便捷。同样,Tomcat针对ResponseSession也封装了对应的ResponseFacade类和StandardSessionFacade类,感兴趣的小伙伴可以深入了解一下。

PS:基本上所有以Facade结尾的类,都是使用到了门面模式。

Référence : Cours de modèle de conception de Tom

Résumé

D'accord, j'ai tellement partagé sur le mode façade Après avoir lu cet article, pensez-vous que le mode façade est en fait très simple, et il peut également être utilisé au travail ? Demandez-vous si vous pouvez l'utiliser, et en même temps, vous pouvez également l'utiliser pour vous vanter lors des entretiens.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1596
276
Comment gérer les transactions en Java avec JDBC? Comment gérer les transactions en Java avec JDBC? Aug 02, 2025 pm 12:29 PM

Pour gérer correctement les transactions JDBC, vous devez d'abord désactiver le mode de validation automatique, puis effectuer plusieurs opérations, et enfin vous engager ou randonner en fonction des résultats; 1. Appelez Conn.SetAutoCommit (false) pour démarrer la transaction; 2. Exécuter plusieurs opérations SQL, telles que l'insertion et la mise à jour; 3. Appelez Conn.Commit () Si toutes les opérations sont réussies, et appelez Conn.Rollback () Si une exception se produit pour garantir la cohérence des données; Dans le même temps, les ressources TRY-With doivent être utilisées pour gérer les ressources, gérer correctement les exceptions et clôturer les connexions pour éviter la fuite de connexion; De plus, il est recommandé d'utiliser des pools de connexion et de définir des points de sauvegarde pour réaliser un retour en arrière partiel, et de maintenir les transactions aussi courtes que possible pour améliorer les performances.

Construire des API RESTful à Java avec Jakarta EE Construire des API RESTful à Java avec Jakarta EE Jul 30, 2025 am 03:05 AM

Setupamaven / gradleprojectwithjax-rsDependces likejersey; 2.CreateArestResourceUsingannotationsSuchas @ pathand @ get; 3.ConfigureTheApplicationViaApplicationsUbclassorweb.xml; 4.AddjacksonforjsonBindingByCludingJersey-Media-Json-Jackson; 5.DeploEp

Comment travailler avec le calendrier à Java? Comment travailler avec le calendrier à Java? Aug 02, 2025 am 02:38 AM

Utilisez des classes dans le package Java.Time pour remplacer les anciennes classes de date et de calendrier; 2. Obtenez la date et l'heure actuelles via LocalDate, LocalDateTime et Localtime; 3. Créez une date et une heure spécifiques en utilisant la méthode OF (); 4. Utilisez la méthode plus / moins pour augmenter et diminuer le temps; 5. Utilisez ZonedDateTime et ZoneID pour traiter le fuseau horaire; 6. Format et chaînes de date d'analyse via DateTimeFormatter; 7. Utilisez instantanément pour être compatible avec les anciens types de dates si nécessaire; Le traitement des dattes dans le Java moderne devrait donner la priorité à l'utilisation de Java.timeapi, qui fournit clairement, immuable et linéaire

Mastering Injection de dépendance en Java avec le printemps et Guice Mastering Injection de dépendance en Java avec le printemps et Guice Aug 01, 2025 am 05:53 AM

DépendanceInjection (DI) IsadesignPatternwhereBjectSeveveveltency dexternal, promotionnloosecouplingAndreasiestingthroughroughConstructor, seter, orfieldInjection.2.springframeworkusesannotations like @ composant, @ service et @ autowiredwithjava-baskusecondotations like @ composant, @ service et @ autowiredwithjava-basesConfitations lik

Comparaison des frameworks Java: Spring Boot vs Quarkus vs MicronAut Comparaison des frameworks Java: Spring Boot vs Quarkus vs MicronAut Aug 04, 2025 pm 12:48 PM

Pré-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusofperforming lightbetterine scénarios.

Techniques d'optimisation et de profilage des performances Java Techniques d'optimisation et de profilage des performances Java Jul 31, 2025 am 03:58 AM

Utilisez des outils d'analyse des performances pour localiser les goulots d'étranglement, utiliser VisualVM ou JProfiler dans la phase de développement et de test, et donner la priorité à l'async-profil dans l'environnement de production; 2. Réduire la création d'objets, réutiliser les objets, utiliser StringBuilder pour remplacer l'épissage de la chaîne et sélectionner les stratégies GC appropriées; 3. Optimiser l'utilisation de la collection, sélectionner et prérégler la capacité initiale selon la scène; 4. Optimiser la concurrence, utiliser des collections simultanées, réduire la granularité de verrouillage et régler raisonnablement le pool de threads; 5. Assurez les paramètres JVM, définissez la taille du tas raisonnable et le collecteur de déchets à faible latence et activez les journaux GC; 6. Évitez la réflexion au niveau du code, remplacez les classes de wrapper par des types de base, retardez l'initialisation et utilisez final et statique; 7. Test et surveillance des performances continues, combinées avec JMH

Un guide du développeur à Maven pour la gestion de projet Java Un guide du développeur à Maven pour la gestion de projet Java Jul 30, 2025 am 02:41 AM

Maven est un outil standard pour la gestion et la construction de projet Java. La réponse réside dans le fait qu'il utilise pom.xml pour normaliser la structure du projet, la gestion des dépendances, l'automatisation du cycle de vie de la construction et les extensions de plug-in; 1. Utilisez pom.xml pour définir GroupID, Arfactive, version et dépendances; 2. Commandes Master Core telles que MvnClean, compiler, tester, package, installer et déploier; 3. Utiliser la fonction de dépendance et les exclusions pour gérer les versions et les conflits de dépendance; 4. Organisez de grandes applications via la structure du projet multi-modules et sont gérées uniformément par le POM parent; 5

Comprendre les internes de la machine virtuelle Java (JVM) Comprendre les internes de la machine virtuelle Java (JVM) Aug 01, 2025 am 06:31 AM

Les capacités de «écriture, runany»

See all articles