我有一个场景,其中多个具体类扩展了多个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.