public interface SomeInterfaces {
void send(String message);
String getType();
}
@Component
public class SomeInterfacesKafkaImpl implements SomeInterfaces {
private final String type = "kafka";
@Override
public void send(String message) {
System.out.println(message + "through Kafka");
}
@Override
public String getType() {
return this.type;
}
}
@Component
public class SomeInterfacesRedisImpl implements SomeInterfaces {
private final String type = "redis";
@Override
public void send(String message) {
System.out.println(message + "through Redis");
}
@Override
public String getType() {
return this.type;
}
}
@Component
public class SomeInterfacesMaster {
private final Set<SomeInterfaces> someInterfaces;
public SomeInterfacesMaster(Set<SomeInterfaces> someInterfaces) {
this.someInterfaces = someInterfaces;
}
public void sendMaster(String type){
Optional<SomeInterfaces> service =
someInterfaces
.stream()
.filter(service ->
service.getType().equals(type)
)
.findFirst();
SomeInterfaces someService =
service
.orElseThrow(() -> new RuntimeException("There is not such way for sending messages."));
someService .send(" Hello. It is a letter to ....");
}
}
@SpringBootTest
public class MultiImplementation {
}
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class SomeInterfacesMasterTest extends MultiImplementation {
@Autowired
private SomeInterfacesMaster someInterfacesMaster;
@Test
void sendMaster() {
someInterfacesMaster.sendMaster("kafka");
}
}
因此,根据Open/Closed原则,我们只需要添加一个实现而不破坏现有代码。
@Component
public class SomeInterfacesRabbitImpl implements SomeInterfaces {
private final String type = "rabbit";
@Override
public void send(String message) {
System.out.println(message + "through Rabbit");
}
@Override
public String getType() {
return this.type;
}
}
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class SomeInterfacesMasterTestV2 extends MultiImplementation {
@Autowired
private SomeInterfacesMaster someInterfacesMaster;
@Test
void sendMasterV2() {
someInterfacesMaster.sendMaster("rabbit");
}
}