何时使用模板方法模式

时间:2010-07-17 18:26:58

标签: php design-patterns template-method-pattern

嗨我有一个问题,我必须在不同的数据集上执行类似的步骤/操作(略有不同)(数据在结构方面也可能略有不同)。我需要执行几个步骤:连接,验证,构建错误消息(如果需要),将数据结构更改为设置格式并输出结果。

我正在查看模板方法模式,它看起来很合适 - 这听起来是否正确或是否有更好的方法来解决这类问题?

我的目标是一种设计,可以轻松地将新的数据集添加到系统中,而不会中断任何事情,并且可以更改错误报告等,而不会对系统产生太大影响。

我正在使用php。

2 个答案:

答案 0 :(得分:1)

模板方法听起来不错,但也考虑策略 When to use template method Vs. Strategy?

答案 1 :(得分:1)

策略方法适用于模板方法。

模板方法指定类的要求。策略方法允许您使用对象来定义行为,并使用依赖注入在运行时定义它们。

class CRUDTemplate
{
    protected $updater;
    protected $creator;
    protected $deletor;
    protected $loader;

    public function __construct(IUpdate $updater, ICreator $creator, IDeletor $delete, ILoader $loader)
    {
          $this->updater = $updater;
          //...snipped...
    }

    // sample template function; others are create, delete, update 
    public function load($id)
    {
          $this->content = $this->loader->load($id);
    }
}

虽然示例代码仅显示调用每个策略的模板函数,但更多可以在模板函数的专用重载版本中完成,例如输入验证,初始化等。毕竟,有些东西必须称之为策略。

优点是,对于上面的例子,你可以针对不同的条件使用不同的不同策略集(CRUD可能不是这里最好的例子)。因此,如果您想要更改数据的输出方式,但保留数据的保存/创建/加载方式,则只需更改输出策略即可。

缺点是您必须确保策略适用于正确的上下文,因为没有类型检查以确保您传入的策略是有效的(只要它是预期的基类,任何工作都会有效) 。哦,是的,CRUDTemplate也可以来自基类。

对于数据,在PHP中我发现该数组最适合传递复杂参数。当然,您必须对数组进行验证