CDI活动——如何在 "开放-关闭 "的原则下成功存档

21 阅读3分钟

CDI活动——如何在Open-close原则下归档成功

在这段视频中,你将学习如何使用CDI事件在Open-close原则下归档成功。

当我们谈论一个关于Java和OOP的良好设计时,可能首先想到的是SOLID原则;它带来了五个简单的步骤,或者至少是一个标志,如果代码是在正确的方向上。CDI肯定会帮助你按照正确的顺序来归档代码。今天,我们将解释如何利用CDI的优势,获得Open close原则。

如果你忘记了SOLID原则,不要担心,我们会把它放在这里,以记住SOLID的确实含义:

  • 单一责任原则
  • 开放-封闭原则
  • 利斯科夫替代原则
  • 接口隔离原则
  • 依赖性反转原则

今天的CDI活动,我们将对开放-封闭原则进行归档。开放封闭原则是基于这样一句话。 "软件实体(类、模块、函数等)应该对扩展开放,但对修改封闭"。

这意味着我们可以添加新鲜的功能,因为我们并没有一直修改核心。为了清楚地说明这一点,我们将使用一个示例场景。

想象一下,一个记者将接收新闻,策划并在多个媒体上推广,如电视、媒体出版社、报纸、社交媒体等。

public class News implements Supplier<String> {

    private final String value;

    public News(String value) {
        this.value = value;
    }

    @Override
    public String get() {
        return value;
    }

    @Override
    public String toString() {
        return "News{" +
                "value='" + value + '\'' +
                '}';
    }
}

有了新闻实体,下一步就是创建媒体来发布这些新闻。为了简化第一步,我们将只提供杂志和报纸。

public class Magazine {

    public void receive(News news) {
        System.out.println("Publishing the news on magazine: " + news);
    }
}


public class NewsPaper {

    public void receive(News news) {
        System.out.println("Publishing the newspaper: " + news);
    }
}

完成后,我们就有了新闻和媒体来发布。这个过程的最后一步是创建接收信息并将其发布给现有媒体的人:记者。

@ApplicationScoped
public class Journalist {

    @Inject
    private Magazine magazine;

    @Inject
    private NewsPaper newsPaper;
    
    public void publish(News news) {
        magazine.receive(news);
        newsPaper.receive(news);
    }
}

是的,我们的演示开始工作了;然而,这段代码有什么问题呢?我们需要做什么?让我们设想一下,我们需要添加一个新的新闻类型,比如社会媒体。是的,创建一个类,再次修改《记者》,如果出现了,再修改一个。再一次修改记者,再一次。

所以每次出现新的媒体类型,我们都需要改变Journalist实体,所以我们的代码违背了开放-关闭的原则。

我们需要确保每次增加一个新的媒体类型时,我们都不会再修改Journalist。希望我们有设计模式来使我们的生活更容易,我们在这个资源库上有观察者模式。

CDI用事件来推广它,我们可以向多个观察者发射一个事件;因此,我们不再需要修改实体到新的媒体类型。事实上,实体甚至不知道谁会看这条新闻。它的工作只是策划,然后发布它。

在这段视频中,我们将探索CDI事件的力量,以及如何用它在你的代码上进行健壮和干净的代码设计,以存档成功。