Во-первых, что декоративный узор
- Schema Definition
Декоратор содержит все интерфейсы и ссылки декораторов, метод полностью ссылки назвать свой собственный путь, чтобы добавить новые функции декоратора подкласс.
Категория Не переписывайте метод украсили объекты или изменить поведение объектов украшения, не соответствует шаблону декоратора, только применимой специальной сцену. Классификация используется в основном для расширения класса декоратор методов и свойств
- сценарий спроса
Статические расширения библиотеки. Не изменяю (исходный класс), не наследования, динамические расширения.
- Я не знаю, оригинальные детали реализации класса, обеспечивают только интерфейс, динамические расширения.
- Я не хочу, чтобы иметь больше подклассов, не хочет, чтобы добавить функциональность путем наследования.
- Динамическое расширение функции объекта.
- Должно содержать ссылку на объект содержит экземпляр класса украшается.
Во-вторых, схема конфигурации орнамент
Реализация:
- определяется декоратор, и все методы определены в .h ливневой канализации в .h класса декоратора (метод работы может быть изменен, чтобы добавить) и ссылку на класс декоратор.
- С объектом декоратора вызывает метод, то есть выводить результаты, которые мы хотим в классе декоратора.
- Если вы хотите расширить декоратор, классифицируют по способу, который не может быть разрушен, декоратор родной логики.
В-третьих, образец кода
- Target (Декоратор)
- Target.h
целевая @interface: NSObject / * * * количество монет * / @property (неатомические, ASSIGN) NSInteger МОНЕТКА; / * * * вертикальные и горизонтальные операции * / - ( пустоты ) до; - ( пустоты ) Вниз; - ( недействительный ) влево; - ( недействительный ) право; / * * * операция выбора начальных * / - ( пустоты ) выберите ; - ( недействительный ) старт; / * * * кнопку управления A + B из * / - ( пустот ) Commanda; - ( пустоты ) commandB; @end
- Target.m
@implementation Target - ( аннулируются ) до { NSLog ( @ " вверх " ); } - ( аннулируются ) вниз { NSLog ( @ " вниз " ); } - ( аннулируются ) левый { NSLog ( @ " влево " ); } - ( недействительными ) {право NSLog ( @ " вправо " ); } - ( аннулируются ) выберите { NSLog ( @ " выберите " ); } - ( недействительными) начать { NSLog ( @ " начать " ); } - ( аннулируются ) commandA { NSLog ( @ " commandA " ); } - ( аннулируются ) commandB { NSLog ( @ " commandB " ); } @end
- Target.h
- Декоратор (декоратор)
- Decorator.h
#import <Foundation / Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface декоратор: в NSObject #pragma Марка - метод декоратор @property (неатомической) NSInteger МОНЕТЫ; - ( ничтожной ) вверх; - ( ничтожной ) Вниз; - ( ничтожной ) слева ; - ( недействительное ) право; - ( аннулируется ) ВЫБРАТЬ ; - ( аннулируется ) Start; - ( аннулируется ) Commanda; - ( аннулируется ) commandB; #pragma Марки - следующий декоративные функции вновь добавленных объекты / * * * оставшиеся несколько команда * / @property (неатомический, Readonly ) NSInteger Lives; / * * * чит (вверх и вниз по вертикали около ABAB) * / - ( аннулируются ) Чит; @end
- Decorator.m
#import " Decorator.h " #import " Target.h " @interface декоратор () @property (неатомическая, сильная) Целевая цель; // держать объект класса декоратора @end @implementation декоратор #pragma Марк - Initialization - ( instanceType) инициализация { IF (Self = [Супер INIT]) { // декоративный объект содержит ссылку на реальный объект self.target = [мишень нового новый ]; } вернуть себе; } #pragma Марки - пусть реальный объект соответствует эталонному выполнению метод - ( недействительными ) {вверх [_target вверх]; } - (недействительными ) вниз { [_target вниз]; } - ( пустоты ) левый { [_target влево]; } - ( недействительными ) вправо { [_target вправо]; } - ( недействительными ) выберите { [_target выбора ]; } - ( пустоты ) начало { [_target пуск]; } - ( недействительными ) commandA { [_target commandA]; } - ( недействительными ) commandB { [_target commandB]; } #Pragma марка -装饰器新添加的方法 - ( недействительными) обмануть { [_target вверх]; [_target вниз]; [_target вверх]; [_target вниз]; [_target влево]; [_target право]; [_target влево]; [_target право]; [_target commandA]; [_target commandB]; [_target commandA]; [_target commandB]; } @Synthesize живет = _lives; - (NSInteger) живет { // 相关处理逻辑 возврата 10 ; } @end
- Decorator.h
В-четвертых, преимущества и недостатки орнаментами
- Преимущество
в случае определенных классов без изменения бизнес - логики и функции для расширения существующего метода
Пять, демо
декоратор