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
这里补充一下,属性括号中的内容为属性控制符,分别对属性的读写权限,内存管理和线程操作做出相关规定。
读写权限由两个关键字控制,分别为:readonly
和readwrite
。其中如果不写默认为readwrite
。通常属性的读写权限都为可读可写。内存管理权限由四个关键字控制,分别为:assgin
,strong
,weak
和copy
。如果不写,默认为assgin
。如果属性类型为基本数据类型,那么只能用assgin
。如果属性类型为对象指针,一般情况下用strong
,特殊情况下用weak
或copy
。线程操作权限由两个关键字控制,分别为:atomic
和nonatomic
。其中如果不写默认为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
时间: 2024-10-20 13:43:05