首先需要一个需要装饰的类Object:
@interface Object : NSObject
- (void)doOneThing;
- (void)doOtherThing;
@end
@implementation Object
- (void)doOneThing {
NSLog(@"object do one thing");
}
- (void)doOtherThing {
NSLog(@"object do other thing");
}
@end
然后需要类Object的装饰抽象类,其他具体的装饰实现类都要继承自这个装饰抽象类:
@interface ObjectAbstractDecorator : Object
- (id)initWithObject:(Object *)obj;
@end
@interface ObjectAbstractDecorator () {
Object* _obj;
}
@end
@implementation ObjectAbstractDecorator
- (id)initWithObject:(Object *)obj {
if (self = [self init]) {
_obj = obj;
}
return self;
}
- (void)doOneThing {
[_obj doOneThing];
}
- (void)doOtherThing {
[_obj doOtherThing];
}
@end
然后是装饰实现类,
@interface DoOneThingDecorator : ObjectAbstractDecorator
@end
@implementation DoOneThingDecorator
- (void)doOneThing {
NSLog(@"DoOnethingDecorator do one thing");
[super doOneThing];
}
@end
@interface DoOtherThingDecorator : ObjectAbstractDecorator
@end
@implementation DoOtherThingDecorator
- (void)doOtherThing {
NSLog(@"DoOtherThingDecorator do other thing");
[super doOtherThing];
}
@end
在客户端那边调用,最终产生一个经过装饰Object。
int main(int argc, const char * argv[])
{
@autoreleasepool {
Object* obj = [[Object alloc] init];
obj = [[DoOneThingDecorator alloc] initWithObject:obj];
obj = [[DoOneThingDecorator alloc] initWithObject:obj];
obj = [[DoOtherThingDecorator alloc] initWithObject:obj];
[obj doOneThing];
[obj doOtherThing];
}
return 0;
}
通过装饰模式对一个Object进行多次装饰的组合可以很好的避免Object的子类迅速膨胀的问题(避免每一个装饰的组合都需要一个Object的子类)。