Maison  >  Article  >  Java  >  Modèle de conception de stratégie au printemps

Modèle de conception de stratégie au printemps

Patricia Arquette
Patricia Arquetteoriginal
2024-10-21 20:09:03196parcourir

Strategy Design Pattern in Spring

Dans les applications d'entreprise, nous aurons différentes implémentations selon nos exigences commerciales. Au moment de l'exécution, nous devons en exécuter un en fonction de certaines conditions. Des exemples courants sont les algorithmes de tri, le cryptage des données, les services de notification, les services d'authentification, les services de paiement...

Au lieu d'utiliser des conditions if-else, nous pouvons utiliser un modèle de conception de stratégie pour le mettre en œuvre. Le modèle de conception de stratégie nous aidera à exécuter/utiliser différentes implémentations au moment de l'exécution. La stratégie fournit au code une réutilisabilité, une flexibilité, une séparation des préoccupations et une extensibilité.

Considérez que vous avez développé un service d'authentification unifié qui recevra les demandes de différents canaux/clients. Au moment de l'exécution, en fonction de la configuration, vous devez décider de l'implémentation utilisée à des fins d'authentification (cela peut également être une demande de transfert). Vos implémentations peuvent être Okta, Azure Ad ou Your Own IAM.

Remarque : Nous devons implémenter les fournisseurs en tant que modules indépendants et les ajouter au projet principal en tant que dépendance.

Interface de stratégie

public interface Authentication {

    AuthenticationRes authentication(AuthenticationReq authenticationReq);
    OtpDevicesRes otpDevices(OtpDevicesReq otpDevicesReq);
    SendOtpRes sendOtp(SendOtpReq sendOtpReq);
    VerifyOtpRes verifyOtp(VerifyOtpReq verifyOtpReq);

}

Stratégies concrètes

@Component("oktaAuthentication")
@Slf4j
public class OktaAuthentication implements Authentication {
    --------------
    --------------
    --------------
}

@Component("ferAuthentication")
@Slf4j
public class FerAuthentication implements Authentication {
      --------------
      --------------
      --------------
}

@Component("eapAuthentication")
@Slf4j
public class EapAuthentication implements Authentication {
      --------------
      --------------
      --------------
}

Service

@Service
@Slf4j
public class AuthenticationService {

    public Map<String, Authentication> authenticationProvidersMap;
    public Set<String> availableAuthProviders;

    public AuthenticationService(Map<String, Authentication> authenticationProvidersMap) {
        this.authenticationProvidersMap = authenticationProvidersMap;
        this.availableAuthProviders = this.authenticationProvidersMap.keySet();
        log.info("Available Auth providers:{}", this.availableAuthProviders);
    }

    public AuthenticationRes getAuthentication(AuthenticationReq authenticationReq, ClientDetails clientDetails) {

        //This method will identify authentication provider based on client details
        // and returns oktaAuthentication/eapAuthentication/ferAuthentication
        String authProvider = getAuthProviderDetails(clientDetails);

        if (this.availableAuthProviders.contains(authProvider)) {
            return this.authenticationProvidersMap.get(authProvider)
                    .authentication(authenticationReq);
        } else {
            throw new AuthProviderUnavailable(authProvider);
        }

    }


    public String getAuthProviderDetails(ClientDetails clientDetails) {
        // implement your business logic to return the provider that need to be used. 
    }
}

Si vous avez des questions, veuillez laisser une question dans la section commentaires.

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:
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