装饰师案件与否?

时间:2013-03-29 09:27:14

标签: php design-patterns

我有一个合同“ArticleStorage”,每个存储必须订阅才能对模型有效。 没错,这不是问题,我的问题是:分页......或“结果修改”,在本例中是 fetchAll ,我想修改其行为但不添加参数等

<?php

interface ArticleStorage
{
    // public function insert();
    // public function update();
    // public function delete();
    public function fetchAll();
}

class MySQLArticleStorage implements ArticleStorage
{
    public function fetchAll()
    {
        // SELECT * FROM `articles`;
    }
}

&GT;

我的模型如何运作。

class ArticlesModel
{
    public function __construct(ArticleStorage $storage)
    {

    }
}

在这种情况下,我期待一个“ArticleStorage”,但不知道给出了哪个“存储”,是真的......我想使用存储分页或应用结果修改。

class MySQLArticleResultsModifier
{
    public function __construct(MySQLArticleStorage $storage)
    {

    }
    public function fetchAll() 
    {
        // ...
    }
}

如果是分页,我如何修改ArticleStorage fetchAll并应用我修改后的查询?

1 个答案:

答案 0 :(得分:0)

是否存在您的模型要求在另一个胎儿之上加上胎儿的情况;我不这么认为,事实上这就是你如何决定是否需要一个装饰师,通过自己回答这个问题

  • 您正在考虑装饰功能,使装饰像装饰一样{就像一个真正的装饰,你可以在你的圣诞树上放置星星{decoration1},以及你的树上的一些玩具{decoration2}在同一个实例中?否则制作装饰器模式没有意义,装饰器的本质是装饰来自外部世界的具体实现,并改变输出,而不受应用于具体实例的其他装饰的影响。

现在关于当前的实现,我认为@mrhobo非常正确,你的fetch函数可能看起来像

public function fetch($limit, $order,$sort)

非常智能的提取还可以期望用户发送键值的哈希表,列名=列的值,您可以使用它来动态创建自己的选择查询。