Apache Storm有一个带有非类型化Map的接口IBasicBolt。
//org.apache.storm.topology.IBasicBolt
public interface IBasicBolt extends IComponent {
void prepare(Map stormConf, TopologyContext context);
...
}
我想在我的抽象类中添加一个键入的Map
public abstract class MyClass implements IBasicBolt {
@override
public void prepare(Map<String, Object> stormConf, TopologyContext context) {
}
}
在不将<String, Object>
添加到风暴类的情况下,有什么方法可以做到这一点吗?
Adapter模式适用于这种类型的情况,尽管在您的用例中可能并不完全是您想要的。但这是一种值得了解的模式,可能会引导你朝着正确的方向前进。
意图
将类的接口转换为客户端期望的另一个接口。适配器使类能够协同工作,否则由于接口不兼容而无法协同工作。
示例
因此,考虑目标接口,即您希望编程到的接口:
public interface IMyBasicBolt {
void prepare(Map<String, Object> stormConf, String other);
}
(注意:为了简单起见,我已将TopologyContext
替换为String
)
然后,您可以创建一个适配器类,该类实现您的目标接口,并将行为(组合)委托给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);
}
}
适配器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");
在您的情况下,并不严格需要接口IMyBasicBolt
(您的目标接口)。但在可能的情况下,编程到一个接口通常是好的。