Apache Storm有一个带有无类型Map的接口IBasicBolt。
//org.apache.storm.topology.IBasicBolt
public interface IBasicBolt extends IComponent {
void prepare(Map stormConf, TopologyContext context);
...
}
我想在抽象类中添加一个类型化的地图
public abstract class MyClass implements IBasicBolt {
@override
public void prepare(Map<String, Object> stormConf, TopologyContext context) {
}
}
如果没有将<String, Object>
添加到风暴类中,有没有办法做到这一点?
答案 0 :(得分:4)
Adapter pattern适用于此类情况,但在您的使用案例中可能并不完全是您所追求的。但这是一个值得了解的模式,可能会引导你朝着正确的方向前进。
<强>意图强>
将类的接口转换为客户期望的另一个接口。适配器允许类一起工作,否则由于不可比的接口而无法使用。
示例强>
因此,请考虑目标界面,即您希望编程的目标界面:
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
(您的目标接口)。但是在可能的情况下编程到接口通常会很好。