Muito bacana.
Tem alguns insigths aproveitando seu trabalho.
No java com springboot tu pode usar um evento, deixando essa chamada mais desacoplada do teu código pois quem emite o evento não precisa conhecer quem vai ouvir. Confesso que não sei se o nome continuaria chamando Observer mas seria algo como:
- Um cara que vai ser o representante de eventos de um canal
import org.springframework.context.ApplicationEvent;
public class ChannelEvent extends ApplicationEvent {
public ChanelEvent(EventType event) {
super(event);
}
}
Tua classe canal
import org.springframework.context.ApplicationEventPublisher;
public class Canal {
private final ApplicationEventPublisher eventPublisher;
private String nomeDoCanal;
private List<Observer> listaDeInscritos;
.....
public void notificarInscritos() {
//aqui tu dispara o evento
eventPublisher.publishEvent(new ChannelEvent(EventType.NEW_MOVIE));
}
.....
}
Por fim uma service que vai ficar escutando os eventos. Tu pode ter 1 ou n services de propósitos diferentes:
@EventListener
public void onPath(final ChanelEvent event) {
if(EventType.NEW_MOVIE.equals(event)) {
// faz alguma coisa como buscar no banco todos os insvcritos e enviar uma notificação. Neste caso mandei só um enum mas poderia ter mandado um objeto com mais informações.
}
}
Como pode ver, a vantagem desta implementação é que você cria um evento e ele estará sempre disponível em todo seu projeto. Pense que poderia ser um evento de banco de dados. Sempre que eu salvar um objeto específico quero validar se ele atende algum critério. Mas o principal é que tu mantem desacoplado o teu código. A classe Chanel não tem obrigação de saber quem quer ser notificado quando um novo video for lançado. No teu caso, tu falou de inscritos mas poderiamos ter uma outra service que iria ouvir novos vídeos para classificar eles por relevancia , ou para aplicar um processamento de video em busca de irregularidades. Obvio, citei coisas que talvez sejam resolvidas melhor num microservice mas deu pra entender.