


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

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.

Undress AI Tool
Images de déshabillage gratuites

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)

Sujets chauds

Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Lorsque vous utilisez TkMyBatis pour les requêtes de base de données, comment obtenir gracieusement les noms de variables de classe d'entité pour créer des conditions de requête est un problème courant. Cet article épinglera ...

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Explication détaillée de la conception des tables SKU et SPU sur les plates-formes de commerce électronique Cet article discutera des problèmes de conception de la base de données de SKU et SPU dans les plateformes de commerce électronique, en particulier comment gérer les ventes définies par l'utilisateur ...
