Шаблон проектирования “Итератор”

Сегодня наконец вернемся к теме шаблонов проектирования и рассмотрим такое шаблон как Итератор.

Для начала давайте рассмотрим в общих чертах некоторые ситуацию в которой этот шаблон может помочь.

Допустим, задача нашей программы – проверка работоспособности какой-то сложной системы из большого кол-во разнообразных объектов-модулей. Для этого нужно будет последовательно обратиться к каждому объекту и проверить его состояние.

В случае, если все объекты в рабочем состоянии, то и сама система тоже работает.
В этом случае нужно как-то реализовать последовательный обход всех объектов. Для этого, предварительно нужно их собрать как-то в коллекцию и организовать удобный доступ к ней через промежуточный интерфейс.

В результате работы этого шаблона цикл обхода нашего набора модулей будет выглядеть довольно удобно:

$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];
	}
}

Еще одним полезным качеством этого шаблона является то, что при необходимости можно изменить способ обхода объектов, внеся изменения только в один класс или вообще решить этот вопрос через наследование.
На своей практике Вы наверняка ни раз столкнетесь с ситуацией в которой это шаблон можно будет применить. Как только это случиться – обязательно воспользуйтесь шансом и Вам не придется об этом жалеть.

На этом у меня все. Удачи и до встречи! :)





Читайте также:



4 Ответов на “Шаблон проектирования “Итератор””

  1. В php 5 есть встроенный интерфейс итератора, реализовав который, объект итерируется как массив.
    Тут описано: Your text to link…

  2. Igor

    Цель статьи как я понял объяснить, что это за шаблон и с чем его едят.

  3. 2 Andy: Полезно знать как это устроено :)

  4. Спасибо за шаблон. Очень поможет в работе.


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map