Facade
Publié le 31 Mars 2025Facade (façade en français) est un design pattern structurel qui fournit une interface simplifiée et unifiée à un ensemble de classes complexes. Son objectif est de réduire la complexité et d’améliorer la lisibilité du code en cachant les détails d’implémentation derrière une interface plus simple.
Principe
Exemples d’utilisation du pattern Facade
Gérer l’authentification des utilisateurs
API pour interagir avec des services tiers
Points d’attentions
Implémenter le pattern Facade
Exemple d'utilisation de Facade en Go
package auth
import "fmt"
type AuthService struct{}
func (a *AuthService) Authenticate(email, password string) bool {
fmt.Println("Vérification des identifiants...")
return email == "user@example.com" && password == "securepassword"
}
package auth
import "fmt"
type SessionService struct{}
func (s *SessionService) StoreSession(email, token string) {
fmt.Println("Session stockée en cache pour", email)
}
package auth
import "fmt"
type TokenService struct{}
func (t *TokenService) GenerateToken(email string) string {
fmt.Println("Génération du token JWT...")
return "jwt_token_123"
}
package auth
type AuthFacade struct {
authService AuthService
tokenService TokenService
sessionService SessionService
}
func NewAuthFacade() *AuthFacade {
return &AuthFacade{
authService: AuthService{},
tokenService: TokenService{},
sessionService: SessionService{},
}
}
func (f *AuthFacade) Login(email, password string) string {
if !f.authService.Authenticate(email, password) {
return "Erreur d'authentification"
}
token := f.tokenService.GenerateToken(email)
f.sessionService.StoreSession(email, token)
return token
}
package main
import (
"fmt"
"/designPatterns/facade/auth"
)
func main() {
authFacade := auth.NewAuthFacade()
token := authFacade.Login("user@example.com", "securepassword")
fmt.Println("Token généré:", token)
}
Le même exemple en PHP
namespace Practice\DesignPatterns\Facade;
class AuthService
{
public function authenticate($email, $password)
{
echo "Vérification des identifiants...\n";
return $email === "user@example.com" && $password === "securepassword";
}
}
namespace Practice\DesignPatterns\Facade;
class SessionService
{
public function storeSession($email, $token)
{
echo "Session stockée en cache pour $email\n";
}
}
namespace Practice\DesignPatterns\Facade;
class TokenService
{
public function generateToken($email)
{
echo "Génération du token JWT...\n";
return "jwt_token_123";
}
}
namespace Practice\DesignPatterns\Facade;
class AuthFacade
{
private AuthService $authService;
private TokenService $tokenService;
private SessionService $sessionService;
public function __construct()
{
$this->authService = new AuthService();
$this->tokenService = new TokenService();
$this->sessionService = new SessionService();
}
public function login($email, $password)
{
if (!$this->authService->authenticate($email, $password)) {
return "Erreur d'authentification";
}
$token = $this->tokenService->generateToken($email);
$this->sessionService->storeSession($email, $token);
return $token;
}
}
declare(strict_types=1);
use Practice\DesignPatterns\Facade\AuthFacade;
require "./vendor/autoload.php";
$authFacade = new AuthFacade();
$token = $authFacade->login("user@example.com", "securepassword");
echo "Token généré: $token\n";