Le Adapter pattern est approprié pour ce type de situation, bien que dans votre cas d'utilisation, ce ne soit pas forcément ce que vous recherchez. Mais c'est un modèle qui mérite d'être connu et qui peut vous orienter dans la bonne direction.
intention
Convertir l'interface d'une classe dans une autre interface clients attendent. L'adaptateur permet aux classes de fonctionner ensemble qui ne pourraient pas autrement à cause d'interfaces incompatibles.
Exemple
considèrent donc l'interface cible, à savoir celui que vous souhaitez programmer à:
public interface IMyBasicBolt {
void prepare(Map<String, Object> stormConf, String other);
}
(Note: J'ai remplacé TopologyContext
avec String
pour simplifier)
Vous peut ensuite créer une classe d'adaptateur qui implémente votre interface cible et délègue le comportement (composition) à une implémentation de IBoltBasic
.
public class BasicBoltAdapter implements IMyBasicBolt {
private IBasicBolt basicBolt;
public BasicBoltAdapter(IBasicBolt basicBolt) {
this.basicBolt = basicBolt;
}
@Override
public void prepare(Map<String, Object> stormConf, String other) {
basicBolt.prepare(stormConf, other);
}
}
Exemple d'utilisation de l'adaptateur BasicBoltAdapter
:
IBasicBolt basicBolt = new IBasicBolt() {
@Override
public void prepare(Map stormConf, String other) {
System.out.println(stormConf.toString() + " " + other);
}
};
Map<String, Object> map = new HashMap<>();
map.put("MapKeyTest", new Object());
IMyBasicBolt myBasicBolt = new BasicBoltAdapter(basicBolt);
myBasicBolt.prepare(map, "Test");
Il n'y a pas strictement nécessaire pour l'interface IMyBasicBolt
(interface cible) dans votre cas. Mais il est généralement bon de programmer une interface si possible.