Untitled
unknown
plain_text
2 years ago
4.6 kB
6
Indexable
// Общий интерфейс компонентов. interface DataSource is method writeData(data) method readData():data // Один из конкретных компонентов реализует базовую // функциональность. class FileDataSource implements DataSource is constructor FileDataSource(filename) { ... } method writeData(data) is // Записать данные в файл. method readData():data is // Прочитать данные из файла. // Родитель всех декораторов содержит код обёртывания. class DataSourceDecorator implements DataSource is protected field wrappee: DataSource constructor DataSourceDecorator(source: DataSource) is wrappee = source method writeData(data) is wrappee.writeData(data) method readData():data is return wrappee.readData() // Конкретные декораторы добавляют что-то своё к базовому // поведению обёрнутого компонента. class EncryptionDecorator extends DataSourceDecorator is method writeData(data) is // 1. Зашифровать поданные данные. // 2. Передать зашифрованные данные в метод writeData // обёрнутого объекта (wrappee). method readData():data is // 1. Получить данные из метода readData обёрнутого // объекта (wrappee). // 2. Расшифровать их, если они зашифрованы. // 3. Вернуть результат. // Декорировать можно не только базовые компоненты, но и уже // обёрнутые объекты. class CompressionDecorator extends DataSourceDecorator is method writeData(data) is // 1. Запаковать поданные данные. // 2. Передать запакованные данные в метод writeData // обёрнутого объекта (wrappee). method readData():data is // 1. Получить данные из метода readData обёрнутого // объекта (wrappee). // 2. Распаковать их, если они запакованы. // 3. Вернуть результат. // Вариант 1. Простой пример сборки и использования декораторов. class Application is method dumbUsageExample() is source = new FileDataSource("somefile.dat") source.writeData(salaryRecords) // В файл были записаны чистые данные. source = new CompressionDecorator(source) source.writeData(salaryRecords) // В файл были записаны сжатые данные. source = new EncryptionDecorator(source) // Сейчас в source находится связка из трёх объектов: // Encryption > Compression > FileDataSource source.writeData(salaryRecords) // В файл были записаны сжатые и зашифрованные данные. // Вариант 2. Клиентский код, использующий внешний источник // данных. Класс SalaryManager ничего не знает о том, как именно // будут считаны и записаны данные. Он получает уже готовый // источник данных. class SalaryManager is field source: DataSource constructor SalaryManager(source: DataSource) { ... } method load() is return source.readData() method save() is source.writeData(salaryRecords) // ...Остальные полезные методы... // Приложение может по-разному собирать декорируемые объекты, в // зависимости от условий использования. class ApplicationConfigurator is method configurationExample() is source = new FileDataSource("salary.dat") if (enabledEncryption) source = new EncryptionDecorator(source) if (enabledCompression) source = new CompressionDecorator(source) logger = new SalaryManager(source) salary = logger.load() // ...
Editor is loading...
Leave a Comment