• Спонсоры

  • Рубрики

  • Архивы

  • Популярное



Шаблон проектирования «Итератор»

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

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

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

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

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

$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. Спасибо за шаблон. Очень поможет в работе.

Оставить комментарий


© 2008 - 2017 i-novice.net | Все права защищены.