实现一个没有接口类型参数的接口



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(您的目标接口)。但在可能的情况下,编程到一个接口通常是好的。

最新更新