oc的复合模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oc的复合模式相关的知识,希望对你有一定的参考价值。

OCD 复合方式

    在OC的复合模式就是把其他对象作为自身的题部分,以提升自身的功能。

    举一个例子:

    比如要建造一间房屋,房屋由门和窗等组成,门和窗户有自己的开关方法,然后将门和窗户这些复合在一起成为房屋          类,调用房屋类的进出方法实际调用到门的开关,调用房屋的换气方法,实际调用到窗户的开关,提供属性(存取方法),实现更换门窗。

    1.首先我们进行门类和窗的声明,并实现门和窗应有的方法,作为房屋类的一部分

1 #import <Foundation/Foundation.h>
2 
3 @interface Door : NSObject
4 -(void)openTheDoor;  //开门
5 -(void)closeTheDoor;  //关门
6 -(NSString *)change;  //更换门
7 @end
1 #import <Foundation/Foundation.h>
2 
3 @interface Window : NSObject
4 -(void)openTheWindow;
5 -(void)closeTheWindow;
6 -(NSString *)change;  //更换窗
7 
8 @end

   2.对门和窗类的实现

 1 #import "Door.h"
 2 
 3 @implementation Door
 4 -(NSString *)description
 5 {
 6     return [NSString stringWithFormat:@"木门"];
 7 }
 8 
 9 -(NSString *)change
10 {
11     return [NSString stringWithFormat:@"木门换成铁门"];
12 }
13 
14 -(void)openTheDoor
15 {
16     NSLog(@"开门进出");
17 }
18 
19 -(void)closeTheDoor
20 {
21     NSLog(@"关门");
22 }
23 
24 @end
 1 #import "Window.h"
 2 
 3 @implementation Window
 4 
 5 
 6 -(NSString *)description
 7 {
 8     return [NSString stringWithFormat:@"木窗"];
 9 }
10 
11 -(NSString *)change
12 {
13     return [NSString stringWithFormat:@"木窗换成铁窗"];
14 }
15 
16 -(void)openTheWindow
17 {
18     NSLog(@"开窗通风");
19 }
20 
21 -(void)closeTheWindow
22 {
23     NSLog(@"关窗");
24 }
25 @end

3.建立一个房屋类

 1 #import <Foundation/Foundation.h>
 2 #import "Door.h"
 3 #import "Window.h"
 4 @interface Hourse : NSObject
 5 @property(strong,nonatomic) Door *door;
 6 @property(strong,nonatomic) Window *window;
 7 @property(strong,nonatomic) NSMutableArray *windowsDoors; //多扇窗多扇门
 8 
 9 -(void)ChangeAir:(Window *)window ; //换气
10 -(void)Turnover:(Door *)door;  //进出
11 -(void)ChangeDoor:(Door *)door;  //换门
12 -(void)ChangeWindow:(Window *)window; //换窗
13 -(void)assembly;//组合
14 @end

   这里补充一下,属性括号中的内容为属性控制符,分别对属性的读写权限,内存管理和线程操作做出相关规定。

读写权限由两个关键字控制,分别为:readonlyreadwrite。其中如果不写默认为readwrite。通常属性的读写权限都为可读可写。内存管理权限由四个关键字控制,分别为:assgin,strong,weakcopy。如果不写,默认为assgin。如果属性类型为基本数据类型,那么只能用assgin。如果属性类型为对象指针,一般情况下用strong,特殊情况下用weakcopy。线程操作权限由两个关键字控制,分别为:atomicnonatomic。其中如果不写默认为atomic。通常我们使用nonatomic作为线程操作。
 1 #import "Hourse.h"
 2 
 3 @implementation Hourse
 4 - (instancetype)init
 5 {
 6     self = [super init];
 7     if (self) {
 8         self.windowsDoors =[NSMutableArray array];  //把多扇窗多扇门用集合装起来
 9     }
10     return self;
11 }
12 
13 
14 -(void)ChangeAir:(Window *)window
15 {
16     //调用窗户的方法
17     [window openTheWindow];
18     [window closeTheWindow];
19 }
20 
21 -(void)Turnover:(Door *)door
22 {
23     //调用门的方法
24     [door openTheDoor];
25     [door closeTheDoor];
26 }
27 
28 -(void)ChangeDoor:(Door *)door
29 {
30     for (int i=0; i<self.windowsDoors.count; i++) {
31         NSLog(@"从第%d扇门换起 %@",i+1,[door change]);
32     }
33 }
34 
35 -(void)ChangeWindow:(Window *)window
36 {
37     for (int i=0; i<self.windowsDoors.count; i++) {
38         NSLog(@"从第%d扇窗换起 %@",i+1,[window change]);
39     }
40 }
41 
42 -(void)assembly //组合门和窗
43 {
44     
45     NSLog(@"%@",self.door);
46     NSLog(@"%@",self.window);
47 }
48 @end
 1 #import <Foundation/Foundation.h>
 2 #import "Hourse.h"
 3 #import "Door.h"
 4 #import "Window.h"
 5 int main(int argc, const char * argv[]) {
 6     @autoreleasepool {
 7        /*
 8         1.编写一个房屋类,由门,窗户等组成,门和窗户有自己的开关方法,然后将门和窗户这些复合在一起成为房屋类
 9         调用房屋类的进出方法实际调用到门的开关
10         调用房屋的换气方法,实际调用到窗户的开关
11         提供属性(存取方法),实现更换门窗
12         */
13         
14         Hourse *h=[Hourse new];
15         Door *d=[Door new];
16         h.door=d;
17         Window *w=[Window new];
18         h.window=w;
19        
20         for (int i=0; i<3; i++) {
21             [h.windowsDoors addObject:w];
22         }
23         [h ChangeAir:w];
24         [h Turnover:d];
25         [h assembly];
26         [h ChangeWindow:w];
27         [h ChangeDoor:d];
28     
29     }
30     return 0;
31 }

运行结果

2016-03-02 21:54:45.449 复合2[4881:557316] 开窗通风
2016-03-02 21:54:45.452 复合2[4881:557316] 关窗
2016-03-02 21:54:45.452 复合2[4881:557316] 开门进出
2016-03-02 21:54:45.452 复合2[4881:557316] 关门
2016-03-02 21:54:45.452 复合2[4881:557316] 木门
2016-03-02 21:54:45.453 复合2[4881:557316] 木窗
2016-03-02 21:54:45.453 复合2[4881:557316] 从第1扇窗换起 木窗换成铁窗
2016-03-02 21:54:45.453 复合2[4881:557316] 从第2扇窗换起 木窗换成铁窗
2016-03-02 21:54:45.453 复合2[4881:557316] 从第3扇窗换起 木窗换成铁窗
2016-03-02 21:54:45.453 复合2[4881:557316] 从第1扇门换起 木门换成铁门
2016-03-02 21:54:45.453 复合2[4881:557316] 从第2扇门换起 木门换成铁门
2016-03-02 21:54:45.454 复合2[4881:557316] 从第3扇门换起 木门换成铁门
Program ended with exit code: 0

 

 

 

 

       

 

   

以上是关于oc的复合模式的主要内容,如果未能解决你的问题,请参考以下文章

OC 复合 组装电脑

Android 片段与复合控件

BlocksKit block从配角到主角—oc通往函数式编程之路--oc rx化?

单例模式Singleton-OC版

复合源文件组织

用于从 cloudkit 检索单列的代码模式/片段