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
   9   10   11   12   13   14   15   16   17   18   19