在我的申请中,有一些阶段需要经过潜在客户。
例如:
New
In Progress
Won
Lost
这些只是11个阶段的四个阶段。在每个阶段,都会有一些必须要执行的操作。
例如,潜在客户从New移动到In Progress,我需要更新四个表中的某组值。
我可以在这里使用的理想设计模式是什么,以便将来如果有任何新阶段,在代码中容易适应它?
我在考虑使用Factory Pattern。
编辑: 我做了这样的事情:
interface StageInterface
{
public function changeStage($previous_stage, $next_stage, $ticket_details);
}
abstract class ParentStage implements StageInterface
{
public function changeStage($previous_stage, $next_stage, $ticket_details)
{
$ticket_details->stage_id = $next_stage;
$ticket_details->save();
return $this;
}
}
Class InProgress extends ParentStage
{
}
class TicketStagesFactory
{
protected $data;
public function __construct($data)
{
$this->data = $data;
}
public function getObject()
{
switch ($this->data) {
case Stage::IN_PROGRESS:
return new \App\Http\Controllers\Stages\InProgress();
break;
}
}
然后我就像这样使用工厂:
$factory = new TicketStagesFactory($next_stage);
$test = $factory->getObject()->changeStage($previous_stage, $next_stage, $ticket_details);
这是正确的方法吗?
答案 0 :(得分:1)
这实际上看起来更像是工作流程。 状态机工作更像这样: 对于一个州,一个事件将使它转移到另一个州。 工作流程更像您所说的: 对于一个州,必须采取行动,这些行动的结果决定下一个州。
我会寻找一个php的工作流引擎来使你的工作可维护。
答案 1 :(得分:0)
这取决于你的程序流程,但想法可能是:
//ABSTRACT CLASS FOR A STAGE
abstract class LeadStage
{
protected $lead;
//INJECT YOUR LEAD OBJECT
public function __construct( Lead $lead )
{
$this->lead = $lead;
}
//handle the stage logic on the $lead object
public abstract function handle();
}
//CONCRETE CLASS FOR A STAGE
class InProgress extends LeadStage
{
//HANDLE THE CONCRETE STAGE LOGIC ON THE LEAD OBJECT
public function handle()
{
//do some logic on $this->lead;
}
}
//LEAD OBJECT
class Lead
{
protected $leadStage;
public function construct( )
{
//here build your first LeadStage object: you could also use a factory
//pattern to create the LeadStage instance
$this->leadStage = //...
}
public function setStage( LeadStage $stage )
{
$this->leadStage = $stage;
}
public function handleStage()
{
$this->leadStage->handle();
}
}
并使用这样的类:
$lead = new Lead();
//will handle the first stage
$lead->handle();
//something causes the stage to change
$lead->setStage( new InProgress( $lead ) );
//will handle the InProgess stage logic
$lead->handleStage();
因此,对每个阶段使用单个类,将委托响应性来处理特定类对象的阶段逻辑。
当您需要添加状态时,您只需创建新的LeadStage
实施