Рабочая тетрадь(4)
.pdf
более строгий случай ассоциации (has a)
имеет жёсткую зависимость времени существования экземпляров класса контейнера и экземпляров содержащихся классов
class DataBase{
public function selectItems(){}
}
class Catalog{ private $db;
function __construct(){ $this->db = new DataBase();
}
function getProducts(){
return $this->db->selectItems();
}
}
используется когда один класс "общается" с другим при помощи создание экземпляра класса
class Utility{
public static function filterData($s){ return strip_tags($s);
}
}
class Model{ private $text;
function getData(){ $this->text=Utility::filterData($this->
text);
}
}
Design Patterns
Порождающие шаблоны проектирования
▪Factory Method/Фабричный метод
▪Abstract Factory/Абстрактная фабрика
▪Singleton/Одиночка
Структурные шаблоны
▪Adapter/Адаптер
▪Decorator/Декоратор
Поведенческие шаблоны
▪Observer/Наблюдатель
▪Strategy/Стратегия
Другие
Лабораторная работа 1.1
Использование шаблона Singleton
Упражнение 1: Изменение класса для работы с базой данных
•В текстовом редакторе откройте файл catalog\classes\DB.class.php
•Создайте в классе закрытое статическое свойство _instance и присвойте ему значение null
•Измените модификатор доступа конструктора класса на закрытый
•Добавьте в класс пустой метод __clone c закрытым модификатором доступа
•В классе создайте и опишите открытый статический метод getInstance()
•В методе getInstance() проверьте содержимое свойства _instance
•Если свойство _instance - null, создайте экземпляр класса DB и присвойте его свойству
_instance
•Метод getInstance() должен возвращать экземпляр класса DB
•Сохраните файл catalog\classes\DB.class.php
Упражнение 2: Использование класса для работы с базой данных
•В текстовом редакторе откройте файл catalog\classes\DVD.class.php
•В конструктор класса DVD так, чтобы он вместо создания экземпляра класса DB обращался к статическому методу класса DB getInstance()
•Сохраните файл catalog\classes\DVD.class.php
•Запустите браузер
•В адресной строке наберите http://mysite.local/catalog/catalog.php
•Выберите несколько элементов формы checkbox
•Нажмите на кнопку [Заказать]
•Убедитесь, что код работает без ошибок
Лабораторная работа 1.2
Использование шаблона Factory
Упражнение 1: Создание дополнительных классов
•В текстовом редакторе откройте файл catalog\classes\DVD.class.php
•Создайте класс BonusDVD, который наследует класс DVD
•В классе BonusDVD перегрузите конструктор
•В конструкторе создайте элемент массива tracks (свойство _tracks) со значением -1
•Не забудьте вызвать родительский конструктор
•Создайте класс DVDFactory
•В классе создайте открытый статический метод create, который принимает в качестве аргумента название необходимого для инициализации класса, то есть DVD или
BonusDVD
•Метод create должен возвращать экземпляр необходимого класса исходя из значения переданного ему аргумента
•Сохраните файл catalog\classes\DVD.class.php
Упражнение 2: Изменение логики выплонения программы
•В текстовом редакторе откройте файл catalog\actions.inc.php
•В управляющей конструкции switch найдите условие case 'anthology'
•Проверьте, был ли передан HTTP-методом POST параметр bonus
•Измените код так, чтобы в переменной $dvd создавался или экземпляр класса DVD, или экземпляр класса BonusDVD, в зависимости от значения параметра bonus
•Сохраните файл catalog\actions.class.php
Упражнение 3: Использование шаблона Фабрика
•Запустите браузер
•В адресной строке наберите http://mysite.local/catalog/catalog.php
•В колонке Исполнитель кликните по любой ссылке
•Выберите несколько элементов формы checkbox
•Нажмите на кнопку [Составить]
•В директории catalog\classes должен появиться файл tracks.log
•Откройте файл и убедитесь, что в первом элементе сериализованного массива отсутствует значение -1
•Переключитесь в браузер и опять кликните по любой ссылке в колонке Исполнитель
•Выберите несколько элементов формы checkbox
•Выберите checkbox Добавить бонус-трек
•Нажмите на кнопку [Составить]
•Переключитесь на файл tracks.log
•Убедитесь, что в первом элементе нового сериализованного массива присутствует значение -1
•Убедитесь, что код работает без ошибок
Лабораторная работа 1.3
Использование шаблона Strategy
Упражнение 1: Создание классов для описания стратегий
•В текстовом редакторе откройте файл catalog\classes\DVD.class.php
•Создайте класс DVDStrategy
•В классе создайте закрытое свойство _strategy
•В классе создайте открытый метод setStrategy($obj), в котором осуществляется присваивание значения переданного аргумента $obj свойству _strategy
•Создайте интерфейс DVDFormat
•В интерфейсе продекларируйте метод get()
•Создайте класс DVDAsXML, который наследует класс DVD и интерфейс DVDFormat
•В классе перегрузите метод get() интерфейса DVDFormat
•Перенесите в тело созданного метода get() содержимое метода getXML класса DVD
•Создайте класс DVDAsJSON, который наследует класс DVD и интерфейс DVDFormat
•В классе перегрузите метод get() интерфейса DVDFormat. Опишите метод get() как: $doc = array();
$doc['dvd']['band'] = $this->_band; $doc['dvd']['title'] = $this->_title; $doc['dvd']['tracks'] = array();
$result = $this->_db->selectItemsByTitle($this->_id); foreach($result as $item){
$track = $doc['dvd']['tracks'][] = $item['title'];
}
$file_name = $this->_band.'-'.$this->_title.'.json'; file_put_contents('output/'.$file_name, json_encode($doc));
•В классе DVDStrategy добавьте метод get(). Опишите метод как: $this->_strategy->get();
•В этом же классе создайте метод __call($method, $args). Опишите метод как: $this->_strategy->$method($args[0]);
•Сохраните файл catalog\classes\DVD.class.php
Упражнение 2: Изменение логики выплонения программы
•В текстовом редакторе откройте файл catalog\actions.inc.php
•В управляющей конструкции switch найдите условие case 'list'
