【问题标题】:Making a layer modular/extensible in Java在 Java 中使层模块化/可扩展
【发布时间】:2015-11-11 12:15:13
【问题描述】:

我是 Java 世界的新手,我的应用程序有点挣扎。我将我的应用程序分为几个层(UI、控制器、...)。底层负责从传感器收集数据。

我的目标是使这一层可扩展,以便外部用户/程序员可以轻松地在其中添加新传感器。

我是否只需将每个传感器分成不同的类别,还是有其他解决方案?

如果这是一个“奇怪”的问题,我很抱歉,我只是一个新手 :)

谢谢!

【问题讨论】:

    标签: java extensible


    【解决方案1】:

    本质上,您正在构建的是一个框架。传感器代码将遵循好莱坞原则:“不要打电话给我,我会打电话给你”

    这是通过应用依赖倒置原则来实现的。

    你创建一个接口 Sensor.java:

    public interface Sensor {
        Reading getReading();
    }
    

    还有一个 Reading.java(使这个通用是一个开放封闭原则的挑战,与您需要从传感器数据结构中获得多少通用性有关):

    public final class Reading {
    }
    

    还有一个 SensorReader.java:

    public final class SensorReader {
        private final Iterable<Sensor> sensors;
        public SensorReader(Iterable<Sensor> sensors) {
            this.sensors = sensors;
        }
        public void readSensors() {
            for (Sensor sensor : sensors) {
                Reading reading = sensor.getReading();
                // so stuff with reading
            }
        }
    }
    

    这里的一切都是框架,这里的一切都是应用程序/客户端代码。

    还有一个 MotorEncoder.java:

    final class MotorEncoder implements Sensor {
        @Override
        public Reading getReading() {
            // do stuff to actually read motor encoder
            return new Reading();
        }
    }
    

    还有一个 Application.java:

    import java.util.Arrays;
    
    public final class Application {
        public static void main(String[] args) {
            Sensor sensor = new MotorEncoder();
            SensorReader sensorReader = new SensorReader(Arrays.asList(sensor));
            sensorReader.readSensors();
        }
    }
    

    【讨论】:

    • 首先感谢您的快速回复!我认为构建一个框架将解决我的问题。不过,我将不得不分析依赖倒置原则,因为现在对我来说有点不清楚。
    • @VoyageMoh 我所知道的最佳资源是 Clean Code 书籍和 Robert C. Martin(又名 Bob 叔叔)的 Clean Coders 视频系列。 cleancoders.com
    • 请问SensorReader.java类的目标是什么?如果我在 Application.java 类中创建第二个 MotorEncoder 对象会怎样。我实际上应该列出所有传感器并将其提供给 SensorReader 构造函数吗?
    • @VoyageMoh SensorReader 类是执行可插入传感器代码的框架或容器。您是对的:在任何给定的配置中,您或您的框架客户端将构建一个主函数,将传感器列表传递给 SensorReader 构造函数。
    【解决方案2】:

    底层可以有List&lt;Gatherer&gt; gatherers变量。 Gatherer 应该是与底层重要方法的接口。

    然后任何人都可以创建自己的 Gatherer 并将其注册到您的层。

    底层负责执行gatherer,注册/删除等

    【讨论】:

      【解决方案3】:

      您可以使用多种机制。例如春天。您可以定义 bean 并在运行时包含它们(放在一个文件夹中),但 bean 必须实现一些定义良好的接口。

      另一种解决方案是使用一些设计模式,例如

      Observer

      Template method

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-21
        • 2019-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多