iOS设计模式之组合模式
组合模式(Composite)
基本理解
- 整体和部分可以一直对待。
 - 组合模式:将对象组合成树形结构以表示“部分--整体”的层次结构。组合模式使得用户对单个对象和组合独享的使用具有一致性。
 - 透明方式和安全方式
- 透明方式:在Component(为组合中的对象声明接口)中声明所有用来管理子对象的方法 。这样实现该接口的子类都具有了该接口中的方法。这样的好处就是叶节点和枝节点对于外界没有区别,他们具有完全一致的行为接口。但问题也很明显,因为Leaf类本身不具备添加删除方法的功能,所以实现它是没有意义的。
 - 安全模式:在Component接口中不去声明Add和Remove方法,那么子类的Leaf也就不需要去实现它,而是在Composite声明所有用来管理子类对象的方法,这样做就不会出现刚才提到的问题,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端调用需要做相应的判断,带来了不便。
 
 
何时使用组合模式
当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以护绿组合对象昂与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。
自定义控件时,就是把一些基本的控件组合起来,通过编程写成一个定制的控件。这就是典型的组合模式应用。
组合模式的好处
- 组合模式定义了包含基本对象和组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这些组合对象又可以被组合,这样不断地递归下去,客户端代码中,任何用的的基本对象的地方都可以使用组合对象了。
 - 组合模式让客户可以一致地使用组合结构和单个对象。
 
何时使用组合模式
- 想获得对象抽象的树形表示(整体部分的层次结构)。
 - 想让客户端统一处理组合结构中的所有对象。
 
在Cocoa Touch框架中使用组合模式
在Cocoa Touch 框架中,UIView被组织成一个组合结构。每个UIView的实例可以包含UIView的其他实例,形成统一的树形结构。让客户端对单个UIView对象和UIView的组合统一对待。
例子
首先,我们先建一个ComComponents类
ComComPonents.h
//
//  ComComponents.h
//  CompositeDemo
//公共的接口
//  Created by zhanggui on 15/8/6.
//  Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ComComponents : NSObject
{
    NSString *name;
}
//@property(nonatomic,strong)NSString *name;
 - (ComComponents *)MyInit:(NSString *)myName;
- (void)Add:(ComComponents *)c;
- (void)Remove:(ComComponents *)c;
-(void)Display:(int)depth;
@end
ComComponents.m
//
//  ComComponents.m
//  CompositeDemo
//类接口
//  Created by zhanggui on 15/8/6.
//  Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "ComComponents.h"
@implementation ComComponents
-(ComComponents *)MyInit:(NSString *)myName {
    name = myName;
    return self;
}
-(void)Add:(ComComponents *)c {
    return;
}
-(void)Remove:(ComComponents *)c {
    return;
}
-(void)Display:(int)depth {
    return;
}
@end
Leaf.h
//
//  Leaf.h
//  CompositeDemo
//叶子类
//  Created by zhanggui on 15/8/6.
//  Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "ComComponents.h"
@interface Leaf : ComComponents
- (Leaf *)MyInit:(NSString *)myName;
@end
Leaf.m
//
//  Leaf.m
//  CompositeDemo
//
//  Created by zhanggui on 15/8/6.
//  Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "Leaf.h"
@implementation Leaf
-(Leaf *)MyInit:(NSString *)myName {
    name = myName;
    return self;
}
-(void)Add:(ComComponents *)c {
    NSLog(@"Can not add a leaf");
}
-(void)Remove:(ComComponents *)c {
    NSLog(@"Can not remove from a leaf");
}
-(void)Display:(int)depth {
    NSLog(@"[%dLevel]%@",depth,name);
}
@end
Composite.h
//
//  Composite.h
//  CompositeDemo
//整体组合类
//  Created by zhanggui on 15/8/6.
//  Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "ComComponents.h"
@interface Composite : ComComponents
{
    NSMutableArray *childrenArr;
}
- (Composite *)MyInit:(NSString *)myName;
@end
Composite.m
//
//  Composite.m
//  CompositeDemo
//
//  Created by zhanggui on 15/8/6.
//  Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "Composite.h"
@implementation Composite
-(Composite *)MyInit:(NSString *)myName {
    name = myName;
    childrenArr = [NSMutableArray new];
    return self;
}
- (void)Add:(ComComponents *)c {
    [childrenArr addObject:c];
}
- (void)Remove:(ComComponents *)c {
    [childrenArr removeObject:c];
}
-(void)Display:(int)depth {
    NSLog(@"[%dLevel]%@",depth,name);
    for(ComComponents *component in childrenArr) {
        [component Display:depth+1];
    }
}
@end
然后在viewDidLoad中
- (void)viewDidLoad {
    [super viewDidLoad];
    Composite *root = [[Composite alloc] MyInit:@"root"];
    [root Add:[[Leaf alloc] MyInit:@"Leaf A"]];
    [root Add:[[Leaf alloc] MyInit:@"Leaf B"]];
    Composite *comp = [[Composite alloc] MyInit:@"Composite X"];
    [comp Add:[[Leaf alloc]MyInit:@"Leaf XA"]];
    [comp Add:[[Leaf alloc]MyInit:@"Leaf XB"]];
    [root Add:comp];
    Composite *comp2 = [[Composite alloc] MyInit:@"Composite XY"];
    [comp2 Add:[[Leaf alloc] MyInit:@"Leaf XYA"]];
    [comp2 Add:[[Leaf alloc] MyInit:@"Leaf XYB"]];
    [comp Add:comp2];
    [root Add:[[Leaf alloc] MyInit:@"Leaf C"]];
    Leaf *leaf = [[Leaf alloc] MyInit:@"Leaf D"];
    [root Add:leaf];
    [root Remove:leaf];
    [root Display:1];
}
输出结果:
2015-08-06 08:45:45.520 CompositeDemo[711:156155] [1Level]root
2015-08-06 08:45:45.520 CompositeDemo[711:156155] [2Level]Leaf A
2015-08-06 08:45:45.520 CompositeDemo[711:156155] [2Level]Leaf B
2015-08-06 08:45:45.520 CompositeDemo[711:156155] [2Level]Composite X
2015-08-06 08:45:45.520 CompositeDemo[711:156155] [3Level]Leaf XA
2015-08-06 08:45:45.520 CompositeDemo[711:156155] [3Level]Leaf XB
2015-08-06 08:45:45.520 CompositeDemo[711:156155] [3Level]Composite XY
2015-08-06 08:45:45.520 CompositeDemo[711:156155] [4Level]Leaf XYA
2015-08-06 08:45:45.521 CompositeDemo[711:156155] [4Level]Leaf XYB
2015-08-06 08:45:45.521 CompositeDemo[711:156155] [2Level]Leaf C
我们可以看出:该例子总共有三个类包括一个接口类ComComponents和两个接口类的子类,这样的话,我们可以直接再两个子类(Leaf和Composite)中去使用接口类中定义的方法,而且也可以重写方法。从而达到了组合(Composite)和单个对象(Leaf)的一致性。
总结
组合模式的主要意图是让树形结构中的每个节点具有相同的抽象接口。这样整个结构可以作为一个统一的抽象结构使用,而不是暴露其内部表示。对每个结点的任何操作,可以通过协议或抽象基类中定义的相同接口来进行
附:
iOS设计模式之组合模式的更多相关文章
- C#设计模式(10)——组合模式(Composite Pattern)
		
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
 - iOS 设计模式之工厂模式
		
iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
 - c++设计模式15 --组合模式
		
今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...
 - 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
		
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
 - JavaScript设计模式之----组合模式
		
javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...
 - C#设计模式(10)——组合模式(Composite Pattern)(转)
		
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
 - C#设计模式:组合模式(Composite Pattern)
		
一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; ...
 - 【GOF23设计模式】组合模式
		
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_组合模式.树状结构.杀毒软件架构.JUnite底层架构.常见开发场景 package com.test.composite ...
 - 设计模式:组合模式(Composite)
		
定 义:将对象组合树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象使用具有一致性. 结构图: Component类: abstract class Component ...
 
随机推荐
- Spring.Net.FrameworkV3.0 版本发布了,感谢大家的支持
			
Spring.Net.FrameworkV3.0 版本发布了,感谢大家的支持. Spring.Net.Framework,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开 ...
 - cocos2d-x开发: 场景实体(entity)管理
			
公司现在开新项目,主题的框架部分都是我自己在做,不用受到别人的牵制,所以还算是比较的自由,很好发挥. 游戏并不大,所以需要用到的地方并不多.今天花了一些时间写了场景entity管理的部分代码,还没有完 ...
 - AC_Dream 1224 Robbers(贪心)
			
题意:n个抢劫犯分别抢到的金钱是k1, k2, k3,...,一共得到的金钱是m, 但是在分钱的时候是按照x1/y, x2/y, x3/y,....的比例进行分配的!这样的话 一些抢劫犯就会觉得不公平 ...
 - Linux命令:ps / top
			
简介:ps - report a snapshot of the current processes. 用途:获取当前时刻程序运行状态 概要:ps [options] 类型:ps is hashed ...
 - JS&CSS文件请求合并及压缩处理研究(三)
			
上篇我们进行了一些代码方面的准备工作.接下来的逻辑是:在View页面解析时,通过 Html.AppendResFile 方法添加的资源文件,我们需要按照分组.优先级,文件名等条件,对其路径进行合并.具 ...
 - Python3.x中bytes类型和str类型深入分析
			
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...
 - 通过Foxit和坚果云实现iPad和PC的pdf同步阅读(修改,笔记)
			
这是解决我之后上班地铁上看书问题的一个关键部分 一个手持电子设备,不大不小 一个方便做笔记的笔 一个方便做笔记的阅读器软件 方便快速地同步(只同步标记最好了) 在查看很多建议以及自己尝试之后,总结了这 ...
 - [Tool] PLSQL使用技巧
			
1.PL/SQL Developer保存自定义界面布局 Tools->Preferences->User Interface->Options->Autosave deskto ...
 - ThroughRain第二次冲刺总结
			
团队名:ThroughRain 项目确定:<餐厅到店点餐系统> 项目背景:本次项目是专门为餐厅开发的一套订餐系统.大家有没有发现在节假日去餐厅吃饭会超级麻烦,人很多, 热门的餐厅基本没有座 ...
 - sprint3与总结
			
backlog-看板-燃尽图-每日立会 github:https://github.com/alfredzhu/team-work 总结:这种团队合作的方式很好,大家在一起沟通,相互交流想法,一起解决 ...