Шаблон проектирования “Итератор”
Сегодня наконец вернемся к теме шаблонов проектирования и рассмотрим такое шаблон как Итератор.
Для начала давайте рассмотрим в общих чертах некоторые ситуацию в которой этот шаблон может помочь.
Допустим, задача нашей программы – проверка работоспособности какой-то сложной системы из большого кол-во разнообразных объектов-модулей. Для этого нужно будет последовательно обратиться к каждому объекту и проверить его состояние.
В случае, если все объекты в рабочем состоянии, то и сама система тоже работает.
В этом случае нужно как-то реализовать последовательный обход всех объектов. Для этого, предварительно нужно их собрать как-то в коллекцию и организовать удобный доступ к ней через промежуточный интерфейс.
В результате работы этого шаблона цикл обхода нашего набора модулей будет выглядеть довольно удобно:
$mod1 = new Module();
$mod2 = new Module();
$mod3 = new Module();
$mods = new ModsList();
$mods->add($mod1)->add($mod2)->add($mod3);
$modules = new ModsIterator($mods);
$sys_status = true;
while ($modules->hasModule()) {
$module = $modules->getCurrentMod();
If (!$module->isOk()) {
$sys_status = false;
}
}
echo "System works : ".$sys_status;
Для реализации этого механизма нам потребуется всего 3 класса: класс модуля, класс списка модулей и класс итератора модулей.
class Module {
private $_status = true;
function __construct() {
}
public function isOk() {
return $this->_status;
}
}
class ModsList {
private $_mods_list;
function __construct() {
}
public function add(Module $mod) {
$this->_mods_list[$this->getCount()+1] = $mod;
return $this;
}
public function getCount() {
return count($this->_mods_list);
}
}
class ModsIterator {
private $_mods;
private $_cur_mod = 0;
function __construct(ModsList $mods) {
$this->_mods = $mods;
}
public function hasModule() {
if ($this->_cur_mod <= count($this->_mods)) {
$this->_cur_mod += 1;
return true;
} else {
return false;
}
}
public function getCurMod() {
return $this->_mods[$this->_cur_mod];
}
}
Еще одним полезным качеством этого шаблона является то, что при необходимости можно изменить способ обхода объектов, внеся изменения только в один класс или вообще решить этот вопрос через наследование.
На своей практике Вы наверняка ни раз столкнетесь с ситуацией в которой это шаблон можно будет применить. Как только это случиться – обязательно воспользуйтесь шансом и Вам не придется об этом жалеть.
На этом у меня все. Удачи и до встречи!
Февраль 25th, 2009
В php 5 есть встроенный интерфейс итератора, реализовав который, объект итерируется как массив.
Тут описано:
Февраль 25th, 2009
Цель статьи как я понял объяснить, что это за шаблон и с чем его едят.
Февраль 25th, 2009
2 Andy: Полезно знать как это устроено