Bonjour,
Dans le cadre d'un développement en C++ sur micro-contrôleur, je cherche un mettre un place un gestionnaire de services. L'idée est :
- Au démarrage de l'application, on détecte certains paramètres et on instancie les services concrets (qui répondent à des interfaces) correspondants.
- On enregistre les services concrets auprès d'un gestionnaire de services.
- Par la suite, quand on a besoin d'un service, on demande au gestionnaire l'implémentation d'un service répondant à l'interface souhaitée.
- On utilise de manière polymorphe l'implémentation concrète du service en utilisant l'interface à laquelle il répond.
J'ai déjà utilisé des mécanismes similaires pour des projets Java embarqués et j'aimerai retrouver quelque chose de similaire. En Java, on utilisait un objet de type Class pour enregistrer et récupérer le service. Voilà à quoi ressemble une implémentation triviale d'un tel gestionnaire :
Lors de l’utilisation, on aura quelque chose comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package com.gradot.serviceproviding; import java.util.HashMap; public class ServiceManager { public static ServiceManager INSTANCE = new ServiceManager(); private HashMap<Class<?>, Object> serviceMap = new HashMap<>(); private ServiceManager() { // Hide constructor } public <T> void register(Class<T> clazz, T service) { serviceMap.put(clazz, service); } @SuppressWarnings("unchecked") public <T> T get(Class<T> clazz) { return (T) serviceMap.get(clazz); } }
Auriez-vous des idées pour faire quelque chose de similaires en C++ ? Suis-je obligé de passer par un ID numérique pour la clé d'enregistrement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public class Main { public static void main(String[] args) { init(); run(); } private static void init() { // Create and register services TemperatureService temp = new OutsideTemperature(); ServiceManager.INSTANCE.register(TemperatureService.class, temp); PrinterService printer = new StandardPrinter(); ServiceManager.INSTANCE.register(PrinterService.class, printer); } private static void run() { // Retrieve the service implementations TemperatureService temperatureService = ServiceManager.INSTANCE.get(TemperatureService.class); PrinterService printerService = ServiceManager.INSTANCE.get(PrinterService.class); // Use them double temperature = temperatureService.getTemperature(); String unit = temperatureService.getUnit(); printerService.print(temperature + unit); } }
Merci d'avance !![]()
Partager