应用中Pipleline /阶段的设计模式

时间:2016-03-17 06:37:17

标签: php algorithm oop laravel design-patterns

在我的申请中,有一些阶段需要经过潜在客户。

例如:

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);

这是正确的方法吗?

2 个答案:

答案 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实施