组合模式,组成模式
意图:将对象组合成树形结构以表示“部分”-“整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个树对象。
组合模式.jpg角色和职责
- Component(树形结构的节点抽象)
为所有的对象定义统一的接口(公共属性、行为等的定义)
提供管理子节点对象的接口方法
(可选)提供管理父节点对象的接口方法 - Leaf(树形结构的叶子节点)
Component的实现子类 - Composite(树形结构的枝节点)
Component的实现子类 - Client
通过Component接口操纵组合部件的对象
代码示例
#import <Foundation/Foundation.h>
//协议表示抽象类,提供增删查方法
@protocol IFile <NSObject>
- (BOOL)add:(id<IFile>)file;
- (BOOL)remove:(id<IFile>)file;
- (void)display;
- (NSArray<IFile> *)getChild;
@end
@interface YQFile : NSObject<IFile>
- (instancetype)initWithName:(NSString *)name;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSMutableArray *list;
@end
@implementation YQFile
- (instancetype)initWithName:(NSString *)name {
if (self = [super init]) {
self.name = name;
self.list = [NSMutableArray array];
}
return self;
}
- (BOOL)add:(id<IFile>)file {
return NO;
}
- (BOOL)remove:(id<IFile>)file {
return NO;
}
- (void)display {
NSLog(@"%@", self.name);
}
- (NSArray<IFile> *)getChild {
return nil;
}
@end
@interface YQFolder : NSObject<IFile>
- (instancetype)initWithName:(NSString *)name;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSMutableArray *list;
@end
@implementation YQFolder
- (instancetype)initWithName:(NSString *)name {
if (self = [super init]) {
self.name = name;
self.list = [NSMutableArray array];
}
return self;
}
- (BOOL)add:(id<IFile>)file {
[self.list addObject:file];
return YES;
}
- (BOOL)remove:(id<IFile>)file {
[self.list removeObject:file];
return YES;
}
- (void)display {
NSLog(@"%@", self.name);
}
- (NSArray<IFile> *)getChild {
return [self.list copy];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
YQFolder *root = [[YQFolder alloc] initWithName:@"root"];
[root display];
YQFile *file1 = [[YQFile alloc] initWithName:@"kof.zip"];
[root add:file1];
YQFolder *folder = [[YQFolder alloc] initWithName:@"dota"];
[root add:folder];
for (id<IFile> file in root.list) {
[file display];
}
}
return 0;
}
/*
root
kof.zip
dota
*/
用处
单个对象和组合对象的使用具有一致性。将对象组合成树形结构以表示“部分”---“整体”。
优点
- 高层模块调用简单
- 节点自由增加
缺点
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
题外话
掌握组合模式的重点就是要理解清楚“部分-整体”还有“单个对象”与“组合对象”的含义。
网友评论