In Unternehmensanwendungen werden wir unterschiedliche Implementierungen entsprechend unseren Geschäftsanforderungen haben. Zur Laufzeit müssen wir eine davon basierend auf bestimmten Bedingungen ausführen. Gängige Beispiele sind Sortieralgorithmen, Datenverschlüsselung, Benachrichtigungsdienste, Authentifizierungsdienste, Zahlungsdienste ...
Anstatt if-else-Bedingungen zu verwenden, können wir zur Implementierung ein Strategieentwurfsmuster verwenden. Das Strategieentwurfsmuster hilft uns, verschiedene Implementierungen zur Laufzeit auszuführen/zu verwenden. Die Strategie bietet Code Wiederverwendbarkeit, Flexibilität, Belangetrennung und Erweiterbarkeit.
Bedenken Sie, dass Sie einen einheitlichen Authentifizierungsdienst entwickelt haben, der Anfragen von verschiedenen Kanälen/Kunden entgegennimmt. Zur Laufzeit müssen Sie basierend auf der Konfiguration entscheiden, welche Implementierung für Authentifizierungszwecke verwendet wird (dies könnte auch eine Anforderungsweiterleitung sein). Ihre Implementierungen können Okta, Azure Ad oder Your Own IAM sein.
Hinweis:Wir müssen Anbieter als unabhängige Module implementieren und sie als Abhängigkeit zum Hauptprojekt hinzufügen.
Strategieschnittstelle
public interface Authentication { AuthenticationRes authentication(AuthenticationReq authenticationReq); OtpDevicesRes otpDevices(OtpDevicesReq otpDevicesReq); SendOtpRes sendOtp(SendOtpReq sendOtpReq); VerifyOtpRes verifyOtp(VerifyOtpReq verifyOtpReq); }
Konkrete Strategien
@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. } }
Wenn Sie Fragen haben, hinterlassen Sie bitte eine Frage im Kommentarbereich.
Das obige ist der detaillierte Inhalt vonStrategiedesignmuster im Frühling. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!