Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Рабочая тетрадь(4)

.pdf
Скачиваний:
36
Добавлен:
10.02.2016
Размер:
7 Мб
Скачать
☆

более строгий случай ассоциации (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'