组合模式(Composite Pattern)

2022-09-14  本文已影响0人  long弟弟

组合模式,组成模式

意图:将对象组合成树形结构以表示“部分”-“整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个树对象。

组合模式.jpg

角色和职责

  1. Component(树形结构的节点抽象)
    为所有的对象定义统一的接口(公共属性、行为等的定义)
    提供管理子节点对象的接口方法
    (可选)提供管理父节点对象的接口方法
  2. Leaf(树形结构的叶子节点)
    Component的实现子类
  3. Composite(树形结构的枝节点)
    Component的实现子类
  4. 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
*/

用处

单个对象和组合对象的使用具有一致性。将对象组合成树形结构以表示“部分”---“整体”。

优点

  1. 高层模块调用简单
  2. 节点自由增加

缺点

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

题外话

掌握组合模式的重点就是要理解清楚“部分-整体”还有“单个对象”与“组合对象”的含义。

上一篇 下一篇

猜你喜欢

热点阅读