Objective C 语言 开发自定义组合模式

Objective-C阿木 发布于 17 天前 7 次阅读


Objective-C中的自定义组合模式实现

组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得用户对单个对象和组合对象的使用具有一致性。在Objective-C中,我们可以通过继承和协议来实现自定义的组合模式。

组合模式的基本概念

在组合模式中,有两个主要的角色:

1. Component:定义了组合中对象的行为,并且声明了管理子组件的接口。

2. Leaf:在组合中表示叶节点对象,叶节点没有子节点。

还有一个可选的角色:

1. Composite:定义有子组件的行为,存储子组件,实现与叶节点对象相同的接口。

Objective-C中的实现

下面我们将通过一个简单的例子来展示如何在Objective-C中实现自定义的组合模式。

定义Component协议

我们定义一个Component协议,它将包含所有组件需要实现的方法。

objc

@protocol Component <NSObject>

- (void)add:(Component )component;


- (void)remove:(Component )component;


- (Component )childAtIndex:(NSUInteger)index;


- (NSUInteger)childCount;


- (void)performAction;

@end


实现Leaf类

Leaf类是组合模式中的叶节点,它实现了Component协议。

objc

@interface Leaf : NSObject <Component>

@property (nonatomic, strong) NSString name;

- (instancetype)initWithName:(NSString )name;

@end

@implementation Leaf

- (instancetype)initWithName:(NSString )name {


self = [super init];


if (self) {


_name = name;


}


return self;


}

- (void)add:(Component )component {


// Leaf类不包含子组件,所以不实现add方法


}

- (void)remove:(Component )component {


// Leaf类不包含子组件,所以不实现remove方法


}

- (Component )childAtIndex:(NSUInteger)index {


// Leaf类不包含子组件,所以不实现childAtIndex方法


return nil;


}

- (NSUInteger)childCount {


// Leaf类不包含子组件,所以childCount为0


return 0;


}

- (void)performAction {


NSLog(@"Leaf: %@", self.name);


}

@end


实现Composite类

Composite类是组合模式中的组合节点,它实现了Component协议。

objc

@interface Composite : NSObject <Component>

@property (nonatomic, strong) NSMutableArray children;

- (instancetype)init;

- (void)add:(Component )component;


- (void)remove:(Component )component;


- (Component )childAtIndex:(NSUInteger)index;


- (NSUInteger)childCount;


- (void)performAction;

@end

@implementation Composite

- (instancetype)init {


self = [super init];


if (self) {


_children = [[NSMutableArray alloc] init];


}


return self;


}

- (void)add:(Component )component {


[self.children addObject:component];


}

- (void)remove:(Component )component {


[self.children removeObject:component];


}

- (Component )childAtIndex:(NSUInteger)index {


return [self.children objectAtIndex:index];


}

- (NSUInteger)childCount {


return self.children.count;


}

- (void)performAction {


for (Component child in self.children) {


[child performAction];


}


}

@end


使用组合模式

现在我们可以创建一个组合,并对其中的组件进行操作。

objc

int main(int argc, const char argv[]) {


@autoreleasepool {


// 创建叶节点


Leaf leaf1 = [[Leaf alloc] initWithName:@"Leaf 1"];


Leaf leaf2 = [[Leaf alloc] initWithName:@"Leaf 2"];



// 创建组合节点


Composite composite = [[Composite alloc] init];


[composite add:leaf1];


[composite add:leaf2];



// 创建另一个组合节点


Composite composite2 = [[Composite alloc] init];


[composite2 add:composite];



// 执行操作


[composite2 performAction];


}


return 0;


}


这段代码将创建一个包含两个叶节点的组合节点,然后将这个组合节点添加到另一个组合节点中。我们调用`performAction`方法来执行操作,这将递归地调用所有叶节点的`performAction`方法。

总结

通过上述示例,我们展示了如何在Objective-C中实现自定义的组合模式。组合模式在处理具有层次结构的对象时非常有用,它允许我们以一致的方式处理单个对象和组合对象。在实际项目中,可以根据需要扩展Component协议和Leaf/Composite类,以适应不同的业务需求。