JAVA – 扩展vs接口 – 战略设计模式

我有一个场景,其中多个具体类扩展了多个Abstract类.我无法想出一个干净的结构,减少文件数量并避免重复代码.

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

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

编辑:
有几个传感器视图实现了Abstract视图类.每个传感器的calculate()方法是不同的.为简单起见,我刚刚列出了3个具体的类.同样,你会有CAnalogVoltageView,CDigitalVoltageView,CCustomVoltageView和CAnalogCurrentView,CDigitalCurrentView,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()的接口CalcInterface.

2)通过3个不同的类实现CalcInterface,例如CAnalogTempCalc,CDigitalTempCalc和CCustomTempCalc.然后在每个类中实现calculate().

3)现在是作曲的时候了.假设您有Sensor类(主类)…然后创建CalcInterface类型的对象. PS:它将具有所有人共同的display().

4)现在制作3个不同的类,扩展传感器称AnalogSensor,TempSensor和CustomSensor ……

5)现在,在运行时,您将生成任何类型(CAnalogTempCalc,CDigitalTempCalc和CCustomTempCalc)对象.

编辑:

以下是类图,我对艺术并不擅长…但是这个图将让您对类和接口以及如何有效地使用它们有所了解.

现在,您只需实现CalcInterface即可实现任意数量的CustomCalcuations …

这是通过遵循策略设计模式来适应变化而不改变当前实现的POWER.

点赞