背景
A为一个通用jar包,涉及监听kafka消息,消费数据入库。
多个项目可通过maven引入A包,实现消费相关数据的功能。
B服务中引入A,且需要对A中的消息进行筛选,筛选出符合条件的推送给三方服务处理。
需要能够在不改动A原有代码情况下,进行有效拓展(也可以不拓展),但需要提供拓展的途径。
处理过程
在通用包A中
class A{
@KafkaHandler
public void listen(String message){
// 处理逻辑1
.....
// 扩展逻辑
this.extend();
// 处理逻辑2
......
}
protected void extend(){
}
}
引入A的服务B中
@KafkaListener(topics = KAFKA_TOPIC,)
public void B extends A{
// 如果服务B不做功能的拓展,则B指定topic并继承A类既可
// 如果B需要做额外的功能拓展,只需要重写A类中的extend方法
@override
protected void extend(){
// 重写父类方法,拓展逻辑
}
}
当监听到消息时,
B继承了A的listen方法,会执行父类中的逻辑,但又因为子类重写了父类的extend(),到执行extend方法时,会走子类的逻辑,从而完成功能的拓展。
总结
利用了java特性的多态性,实现功能扩展,降低了模块间的耦合性。