我的目的是在php中创建两种类型的图形:饼图,线性图形和彼此表示的数据。
每个图表都应该有自己的设置表示形式,如:标签,文本。
在饼图中,需要将指标数显示为数字或百分比。
我已经开始对接口和抽象类进行防御:
interface IGraph {
function percent();
function percentGroup($type);
}
abstract class Graph implements IGraph {
abstract function source();
abstract function percent();
abstract function percentGroup($type);
}
class GraphPie extends Graph {
function source() {}
function percent() {}
function percentGroup($type) {}
}
我意识到应该是一个常见的抽象类Graph
,自定义类应该是GraphPie
,GraphLinear
。
我的问题是为此任务创建类的完整结构。例如,我需要创建另一个类GraphModelClass
来编写从db?
换句话说,我需要在按模式检索数据时构建功能,并且可以在任何图形中表示。
我试图在我的案例中采用模式。我已经审查了模式,如:工厂,门面,但它不适合我。
关于使用模式我遵循这个简短的instruction:
答案 0 :(得分:2)
一般来说,如果您的代码依赖于您或其他人编写的其他代码的不同实现,则只需要interface
。如果您要为多个数据模型实现单个视图,则可以使用interface
。然后,视图可以以接口的形式访问具有合同的模型。
但在您的情况下,您希望以相反的方式执行此操作:对于具有百分比和组名称的聚合数据使用单个模型,对于相同类型的数据使用多个视图(折线图,饼图)。 / p>
您不需要使用对象继承。创建模型以检索和存储数据库中的数据。然后在绘制折线图或饼图的每个视图类中使用相同的模型。
如果您的类名为GraphLine
和GraphPie
,则可以使用单一继承:
class GraphBase { /* generic draw functions, like labels */ }
class GraphLine extends GraphBase { /* Line graph specific drawing */ }
class GraphPie extends GraphBase { /* Pie chart specific drawing */ }
对于数据,您可以像这样创建一个类DataModel
class DataModel {
protected $iYear;
public function setYear(int $iYear) : self {}
public function getGraphData() : array { /* SQL SELECT .. GROUP BY .. */ }
}
然后在GraphBase
:
class GraphBase {
protected $oDataModel;
public function setDataModel(DataModel $oDataModel) : self {
$this->oDataModel = $oDataModel;
return $this;
}
abstract function draw(); // GraphPie and GraphLine should implement this
}
用法:
$Model = new DataModel;
$Model->setYear(2017);
$LineGraph = new GraphLine;
$LineGraph
->setDataModel($Model)
->draw();
答案 1 :(得分:0)
由于您不打算在商业环境中使用它,因此您可能需要考虑使用现成的库,例如JpGraph 使用任何第三方库时,请务必检查如果图书馆的商业用途需要支付许可证,则需要获得许可