Page 14 - 4252
P. 14
interface IReader
{
public function read ();
}
interface IWriter
{
public function write ($ data);
}
Модуль copy повинен покладатися тільки на вироблені абстракції і не ро-
бити ніяких припущень з приводу індивідуальних особливостей об'єктів вводу /
виводу.
while (($ data = $ reader-> read ())! == false)
{
$ Writer-> write ($ data);
}
Приблизно таким чином виглядає використання нашого модуля користу-
вачем.
$ Copier = new copier ();
/ / Копіювання даних з клавіатури в файл
$ Copier-> run (new keyboardReader (), new fileWriter ('. / Filename'));
/ / Надсилання даних з файлу системного оброблювача логів
$ Copier-> run (new fileReader ('. / Filename'), new syslogWriter ());
Тепер модуль copy можна використовувати в різних контекстах копіюван-
ня. Зміна поведінки модуля-копіювальника досягається шляхом асоціації його з
об'єктами інших класів (але які залежать від тих же абстракцій).
Незважаючи на простоту виконаних нами дій ми отримали дуже важливий
результат. Тепер наш код володіє наступними якостями:
• модуль може бути використаний для копіювання даних в контексті від-
мінному від даного;
• ми можемо додавати нові пристрої введення / виведення не змінюючи
при цьому модуль copy.
13