我有一个场景,其中多个具体类 extends
多个 Abstract
类。我不知所措,想出一个干净的结构,减少文件数量,避免代码重复。
要求根据某些标准以不同方式显示各种传感器值。温度、电压、电流等传感器值可以有一个 anlaog 小部件、一个数字标签或两者的组合。对于 3 种不同类型的 View ,我有 3 个 Abstract
类。这 3 个 Abstract
类实现了一个定义如何绘制 View 的方法。每个传感器 View 扩展
3 个抽象
类并实现读取传感器、执行某些工程转换和显示传感器值的方法。
这里的问题是具体类实现的代码是相同的,无论它扩展的是什么 Abstract
类。 CAnalogTempView
、CDigitalTempView
和 CCustomTempView
都具有相同的实现但扩展了不同的类。
这看起来很尴尬。代码重复并且源文件的数量增加了 3 倍。我在这里是否遗漏了一些简单的东西?有这样的问题的模式吗?我可以在运行时扩展
传感器 View 类吗?实际代码更复杂。为了清楚起见,我过度简化了问题陈述。
编辑:
有几个传感器 View 实现了 Abstract
View 类。每个传感器的 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()
的接口(interface)CalcInterface
。
2) 通过 3 个不同的类实现 CalcInterface
,例如 CAnalogTempCalc
、CDigitalTempCalc
和 CCustomTempCalc
。然后在每个类中实现calculate()
。
3) 现在是组合
的时候了。假设您有 Sensor
类(主类)...然后生成 CalcInterface
类型的对象。 PS:它将具有对所有人通用的 display()
。
4) 现在制作 3 个不同的类 extends Sensor
说 AnalogSensor
, TempSensor
和 CustomSensor
.. .
5) 现在在运行时,您将生成任何类型的(CAnalogTempCalc
、CDigitalTempCalc
和CCustomTempCalc
)对象。
编辑:
下面是类图,我不擅长艺术......但是这个图会让你对类和接口(interface)以及如何有效地使用它们有一些想法。
现在,您只需实现CalcInterface
就可以实现任意数量的CustomCalcuations ...
这是POWER在不改变当前实现的情况下适应变化的能力,您可以通过遵循策略设计模式来实现。
关于JAVA - 扩展与接口(interface) - 策略设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091342/