Шаблон проектирования “Итератор”
Сегодня наконец вернемся к теме шаблонов проектирования и рассмотрим такое шаблон как Итератор.
Для начала давайте рассмотрим в общих чертах некоторые ситуацию в которой этот шаблон может помочь.
Допустим, задача нашей программы – проверка работоспособности какой-то сложной системы из большого кол-во разнообразных объектов-модулей. Для этого нужно будет последовательно обратиться к каждому объекту и проверить его состояние.
В случае, если все объекты в рабочем состоянии, то и сама система тоже работает.
В этом случае нужно как-то реализовать последовательный обход всех объектов. Для этого, предварительно нужно их собрать как-то в коллекцию и организовать удобный доступ к ней через промежуточный интерфейс.
В результате работы этого шаблона цикл обхода нашего набора модулей будет выглядеть довольно удобно:
$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]; } }
Еще одним полезным качеством этого шаблона является то, что при необходимости можно изменить способ обхода объектов, внеся изменения только в один класс или вообще решить этот вопрос через наследование.
На своей практике Вы наверняка ни раз столкнетесь с ситуацией в которой это шаблон можно будет применить. Как только это случиться – обязательно воспользуйтесь шансом и Вам не придется об этом жалеть.
На этом у меня все. Удачи и до встречи!
В php 5 есть встроенный интерфейс итератора, реализовав который, объект итерируется как массив.
Тут описано: Your text to link…
Цель статьи как я понял объяснить, что это за шаблон и с чем его едят.
2 Andy: Полезно знать как это устроено
Спасибо за шаблон. Очень поможет в работе.