JAVA - 扩展与接口(interface) - 策略设计模式

标签 java multiple-inheritance code-reuse

我有一个场景,其中多个具体类 extends 多个 Abstract 类。我不知所措,想出一个干净的结构,减少文件数量,避免代码重复。

要求根据某些标准以不同方式显示各种传感器值。温度、电压、电流等传感器值可以有一个 anlaog 小部件、一个数字标签或两者的组合。对于 3 种不同类型的 View ,我有 3 个 Abstract 类。这 3 个 Abstract 类实现了一个定义如何绘制 View 的方法。每个传感器 View 扩展 3 个抽象 类并实现读取传感器、执行某些工程转换和显示传感器值的方法。 这里的问题是具体类实现的代码是相同的,无论它扩展的是什么 Abstract 类。 CAnalogTempViewCDigitalTempViewCCustomTempView 都具有相同的实现但扩展了不同的类。

这看起来很尴尬。代码重复并且源文件的数量增加了 3 倍。我在这里是否遗漏了一些简单的东西?有这样的问题的模式吗?我可以在运行时扩展传感器 View 类吗?实际代码更复杂。为了清楚起见,我过度简化了问题陈述。

编辑: 有几个传感器 View 实现了 Abstract View 类。每个传感器的 calculate() 方法都不同。为了简单起见,我刚刚列出了 3 个具体类。同样,您将拥有 CAnalogVoltageViewCDigitalVoltageViewCCustomVoltageViewCAnalogCurrentViewCDigitalCurrentView, CCustomCurrentView

public abstract class CView
{
    public abstract void draw();
    public abstract void calculate();
}

public abstract class CAnalogView extends CView
{
    public void draw()
    {
         // draw specific to analog view
    }
}

public abstract class CDigitalView extends CView
{
    public void draw()
    {
        // draw specific to digital view
    }
}

public abstract class CCustomView extends CView
{
    public void draw()
    {
        // draw specific to custom view
    }
}

// concrete implementations
public class CAnalogTempView extends CAnalogView
{
    public void calculate()
    {
        // read and calculate sensor value here
    }
}

public class CDigitalTempView extends CDigitalView
{
    public void calculate()
    {
        // calculate here. same as CAnalogTempView::calculate()
    }
}

public class CCustomTempView extends CCustomView
{
    public void calculate()
    {
        // calculate here. same as CAnalogTempView::calculate()
    }
}

最佳答案

策略设计模式会帮助你。嗯,你应该记住一件事。

Use as less extends keyword as possible, better to use Interfaces or composition.

解决方案:

封装calculate(),因为calculate()将来可能会改变,它有不同的实现。

过程:

1) 创建一个具有calculate() 的接口(interface)CalcInterface

2) 通过 3 个不同的类实现 CalcInterface,例如 CAnalogTempCalcCDigitalTempCalcCCustomTempCalc。然后在每个类中实现calculate()

3) 现在是组合 的时候了。假设您有 Sensor 类(主类)...然后生成 CalcInterface 类型的对象。 PS:它将具有对所有人通用的 display()

4) 现在制作 3 个不同的类 extends SensorAnalogSensor, TempSensorCustomSensor .. .

5) 现在在运行时,您将生成任何类型的(CAnalogTempCalcCDigitalTempCalcCCustomTempCalc)对象。

编辑:

下面是类图,我不擅长艺术......但是这个图会让你对类和接口(interface)以及如何有效地使用它们有一些想法。

enter image description here

现在,您只需实现CalcInterface 就可以实现任意数量的CustomCalcuations ...

这是POWER在不改变当前实现的情况下适应变化的能力,您可以通过遵循策略设计模式来实现。

关于JAVA - 扩展与接口(interface) - 策略设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091342/

相关文章:

c++ - 在这种特定情况下,多重继承有那么糟糕吗?

angular - 如何在其他项目中重用 Angular 模块

java - log4j - 写入/记录到多个日志文件取决于应用程序

java - 我们可以在 IntelliJ IDE 中测量代码性能吗

Python多重继承中的错误 "TypeError: could not convert X to Y"

python - 如果定义一个没有 __init__ 方法的类会怎样?

iphone - 不同的警报 View 和 View Controller

python - 如何在Python中扩展(继承)模块?

java - 当使用hibernate加载域对象并且不修改它时,我还需要在服务层定义一个spring事务吗?

java - 在扩展 customRepository 的接口(interface)上必须使用哪个 springboot 注释来覆盖 save() 方法?