


Je travaille depuis cinq ans et je ne comprends toujours pas le modèle de 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. 🎜🎜🎜Les amis développeurs savent tous que le développement back-end est généralement : 🎜
🎜 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. 🎜controller---servie---dao/mapper/repository🎜
🎜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
获取用户信息,然后查UserAccountService
Informations 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
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
只是另一个客户端而已(即Facade
对ServiceA
、ServiceB
、ServiceC
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çade
paireServiceA
, ServiceB
, ServiceC
transparent). Extension du motif de façade
AvantagesQuantity 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
这一个类就好了,我不用去管Connection
、ResultSet
等是怎么创建的,需要的时候,我调用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
针对Response
和Session
也封装了对应的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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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

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

Clothoff.io
Dissolvant de vêtements AI

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 !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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

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

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

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

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

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

Les capacités de «écriture, runany»
