2017-10-13 1 views
1

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>를 추가하지 않고이 작업을 수행 할 수있는 방법이 있나요

?

답변

4

Adapter pattern은 이러한 유형의 상황에 적합하지만 사용 사례가 전적으로 사용자가 아닐 수도 있습니다. 그러나 그것은 알만한 가치가있는 패턴이며 올바른 방향으로 인도 할 수 있습니다.

의도

클라이언트가 기대하는 다른 인터페이스로 클래스의 인터페이스를 변환합니다. 어댑터는 호환되지 않는 인터페이스로 인해 클래스가 함께 작동 할 수있게합니다.

public interface IMyBasicBolt {  
    void prepare(Map<String, Object> stormConf, String other);  
} 

:

은 그래서 하나, 즉 당신이 프로그램하고자하는 대상의 인터페이스를 고려 (참고 : 나는 편의를 위해 StringTopologyContext를 교체 한)

당신에게 그런 다음 대상 인터페이스를 구현하는 어댑터 클래스를 만들고이 비헤이비어 (구성)를 IBoltBasic 구현에 위임 할 수 있습니다. 어댑터 BasicBoltAdapter

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); 
    }  

} 

사용 예 : 귀하의 경우 인터페이스 IMyBasicBolt (대상 인터페이스)에 대한 요구가 엄격 없다

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"); 

. 그러나 가능한 경우 인터페이스에 프로그래밍하는 것이 일반적으로 좋습니다.