Proxy et Facade sont des modèles de conception structurels qui résolvent différentes tâches dans l'organisation de l'architecture des applications.
Proxy agit en tant que substitut ou "représentant" d'un objet. Son rôle est de contrôler l'accès, de mettre en cache, de réaliser le chargement paresseux, de réguler la sécurité ou de répartir les demandes (par exemple, proxy réseau, proxy de sécurité). Proxy implémente le même contrat (interface) que l'objet réel.
Exemple en Java :
public interface Service { void operation(); } public class RealService implements Service { public void operation() { // ... } } public class ProxyService implements Service { private RealService realService = new RealService(); public void operation() { // vérification d'accès realService.operation(); } }
Facade est un modèle qui cache la complexité d'un sous-système en fournissant une interface simplifiée unique. Facade ne s'occupe pas du contrôle d'accès ou de logique complémentaire, il ne fait qu'agréger des appels.
Exemple en Java :
public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } } }
Quand appliquer :
Caractéristiques clés :
Est-il permis d'ajouter des fonctionnalités à plus que les classes de base du sous-système via le modèle Facade ?
Non, Facade ne fait qu'agréger et simplifier des appels, de nouvelles fonctionnalités sont mises en œuvre par d'autres modèles ou dans de nouveaux services.
Est-il nécessaire que Proxy soit implémenté par héritage de l'objet cible ?
Non, Proxy implémente l'interface de la cible, mais utilise souvent la composition (encapsulation de l'objet réel) plutôt que l'héritage.
Peut-on utiliser Facade pour gérer l'accès ou le journal des erreurs ?
Il est préférable d'utiliser Proxy pour cela. Facade n'est pas destiné à un support intégré de la mise en cache, de la journalisation ou de la vérification des droits.