3

我的类为框架提供的迭代器提供了额外的功能,同时向用户隐藏了该迭代器。所以我想对大多数任务使用委托

我的类只需要在当前元素上运行,所以我想我真正需要的只是在我保留在私有字段中的框架提供的迭代器上执行迭代器特定的函数?还是我错过了什么?

所有其他方法都对当前元素进行操作,或者无论如何都是独立的。

4

2 回答 2

0

(我不是这个主题的专家,但我很遗憾看到这样的问题没有得到解答。希望有一天其他人会介入并提供更好的东西。)

最简单的方法似乎是继承自 ArrayObject 之类的东西。

或者,可以定义一个抽象基类,通过委托传递给其构造函数的另一个迭代器来实现迭代器方法(类似于基本示例@http: //php.net/manual/en/class.iterator.php)。

于 2013-08-09T15:19:40.110 回答
0

刚刚解决了这个我之前没有注意到的老问题(不幸的是!)。

PHP 中的委托通常可以使用装饰器来处理。

使用IteratorIterator很容易实现特定的Iterator委托。迭代器模式也已经是一个装饰器模式,所以已经有了这个不错的类可以重用。

它并没有完全隐藏装饰过的迭代器(请参阅getInnerIterator()参考资料),但无论如何您最终可能都不关心委托。

让我们看一个委托的例子Iterator::current()

class Delegate extends IteratorIterator
{
    public function current() {
        $current = parent::current();
        // do your delegated operation on $current
        return $current;
    }
}

然后,您可以通过将迭代器放入委托来创建委托:

$delegate = new Delegate($iterator);

然后使用委托而不是原始迭代器。

有时您需要一个真正的装饰器,将原始迭代器完全包装为主题。Iterator-Garden 中提供了这样的示例:IteratorDecorator

于 2017-08-08T17:39:19.887 回答