Дисциплины - Объектно-ориентированное программирование

Шаблоны проектирования практических задач - Поведенческие шаблоны проектирования - Посетитель

Посетитель — это поведенческий шаблон проектирования, который позволяет добавлять в программу новые операции, не изменяя классы объектов, над которыми эти операции могут выполняться.

Пример на PHP

	interface Visitor {
		public function visit ( Point $point );
	}

	abstract class Point {
		public abstract function accept ( Visitor $visitor );
		private $_metric = -1;
		public function getMetric () {
			return $this->_metric;
		}
		public function setMetric ( $metric ) {
			$this->_metric = $metric;
		}
	}

	class Point2d extends Point {

		public function __construct ( $x, $y ) {
			$this->_x = $x;
			$this->_y = $y;
		}

		public function accept ( Visitor $visitor ) {
			$visitor->visit( $this );
		}

		private $_x;
		public function getX () { return $this->_x; }

		private $_y;
		public function getY () { return $this->_y; }
	}

	class Point3d extends Point {
		public function __construct ( $x, $y, $z ) {
			$this->_x = $x;
			$this->_y = $y;
			$this->_z = $z;
		}

		public function accept ( Visitor $visitor ) {
			$visitor->visit( $this );
		}

		private $_x;
		public function getX () { return $this->_x; }

		private $_y;
		public function getY () { return $this->_y; }

		private $_z;
		public function getZ () { return $this->_z; }
	}

	class Euclid implements Visitor {
		public function visit ( Point $p ) {
			if($p instanceof Point2d)
				$p->setMetric( sqrt( $p->getX()*$p->getX() + $p->getY()*$p->getY() ) );
			elseif( $p instanceof Point3d)
				$p->setMetric( sqrt( $p->getX()*$p->getX() + $p->getY()*$p->getY() + $p->getZ()*$p->getZ() ) );
		}
	}

	class Chebyshev implements Visitor {
		public function visit ( Point $p ) {
			if($p instanceof Point2d){
				$ax = abs( $p->getX() );
				$ay = abs( $p->getY() );
				$p->setMetric( $ax>$ay ? $ax : $ay );
			}
			elseif( $p instanceof Point3d){
				$ax = abs( $p->getX() );
				$ay = abs( $p->getY() );
				$az = abs( $p->getZ() );
				$max = $ax>$ay ? $ax : $ay;
				if ( $max<$az ) $max = $az;
				$p->setMetric( $max );
			}
		}
	}


	function start(){
		$p = new Point2d( 1, 2 );
		$v = new Chebyshev();
		$p->accept( $v );
		echo ( $p->getMetric() );
	};
	start();

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться
814301 БГУИР
814302 БГУИР
814303 БГУИР
894351 БГУИР
90421 БГУИР


Изображения Видео

1. Абстрактная фабрика https://www.youtube.com/watch?v=1mVONOCxfLg
2. Фабричный метод https://www.youtube.com/watch?v=5UqUDR6_2cY
3. Шаблон декоратор https://www.youtube.com/watch?v=Lwb9bm8yKD0
4. Dessign patterns on PHP https://github.com/domnikl/DesignPatternsPHP
5. Приёмы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес; [пер. с англ.: А. Слинкин науч. ред.: Н. Шалаев]. — Санкт-Петербург [и др.] : Питер, 2014. — 366 с. : ил. ; 24 см.
6. Приемы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес; [пер. с англ.: А. Слинкин науч. ред.: Н. Шалаев]. — Санкт-Петербург [и др.] : Питер, 2014. — 366 с. : ил. ; 24 см.
7. Ajax http://erud.by/ajax
8. Ajax http://erud.by/ajax
9. Ajax http://erud.by/ajax
10. Документация Laravel http://laravel.com
Задание к курсовой работе
Задание к курсовой работе
Вопросы к экзамену