[英]Implementing an interface without an interface type parameter
Apache Storm具有接口IBasicBolt和未类型化的Map。
//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) {
}
}
有什么方法可以在不向Storm类添加<String, Object>
情况下执行此操作?
适配器模式适用于这种情况,尽管在您的用例中可能并不完全是您想要的。 但这是一个值得了解的模式,可能会引导您朝正确的方向发展。
意图
将类的接口转换为客户端期望的另一个接口。 Adapter允许类由于接口不兼容而无法一起工作。
例
因此,请考虑目标接口,即您希望编程的接口:
public interface IMyBasicBolt {
void prepare(Map<String, Object> stormConf, String other);
}
(注意:为简单起见,我已将String
替换为TopologyContext
)
然后,您可以创建一个适配器类,该适配器类实现您的目标接口,并将行为(组成)委托给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
使用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
接口(您的目标接口)。 但是在可能的情况下,最好对接口进行编程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.