oc的复合模式

news/2024/7/20 15:46:14 标签: 内存管理

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

 

 

 

 

       

 

   

转载于:https://www.cnblogs.com/zhaochaobin/p/5236670.html


http://www.niftyadmin.cn/n/1447739.html

相关文章

黑客攻击常见方法及安全策略制订(转)

一旦黑客定位了你的网络&#xff0c;他通常会选定一个目标进行渗透。通常这个目标会是安全漏洞最多或是他拥有最多攻击工具的主机。非法入侵系统的方法有很多&#xff0c;你应当对这些方法引起注意。   常见攻击类型和特征   攻击特征是攻击的特定指纹。入侵监测系统和网络…

【索引】Codeforces Round #265 (Div. 2)

Problem A: inc ARG(465A) Problem B: Inbox (100500)(465B) Problem C: No to Palindromes!(464A) Problem D: Restore Cube(464B) Problem E: Substitutes in Number(464C)

【GPDB技术研讨会视频2】Greenplum在TalkingData的应用实践

在8月23日举办的GPDB技术研讨会上&#xff0c;我们邀请了来自TalkingData资深大数据架构师周明。周明向大家介绍了Greenplum在TalkingData内部数据提取平台DataATM的应用和实践&#xff0c;以及相关的一些技术点的分享和探讨。 下面为大家奉上Video和PPT&#xff0c;欢迎讨论交…

Fragment与Activity相互传递数据:

Activity向Fragment传递数据:在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法即可将Bundle数据包传给Fragment. Fragment向Activity传递数据或Activity需要在Fragment运行中进行实时通信:在Fragment中定义一个内部回调接口,再让包含该Fragment的…

Nginx location 匹配顺序整理

Nginx location模块整理 具体的Nginx安装就不在这里描述了&#xff0c;这里只是为了对location的描述 Nginx环境 a. 查看当前系统cat /etc/redhat-release [rootnginx /]# cat /etc/redhat-release CentOS release 6.7 (Final) [rootnginx /]# b. 查看系统内核uname –r [rootn…

【GPDB技术研讨会视频3】GPDB在百度外卖的实践与平台化

今天为大家分享的是来自百度外卖大数据研发部的架构师黄冕。在研讨会上&#xff0c;黄冕详细的介绍了Greenplum在百度外卖深度优化平台上是如何应用和实践的&#xff0c;同时也对相关的一些技术点进行了分享和探讨。 下面为大家奉上Video和PPT&#xff0c;欢迎讨论交流。 分享V…

【Python】爬虫入门强烈推荐系列一

Python爬虫入门目录网页基础网页组成直观展示代码解析网页结构HTML语言Hello WorldHTML代码分析CSS-style检查网页开发者模式爬取Python之禅锁定目标获得信息再次锁定再次获取并保存爬取翻译爬取豆瓣电影网页基础 网页组成 网页是由 HTML 、 CSS 、JavaScript 组成的。 HTML…

菜鸟必备:计算机端口完全解析(转)

端口可分为3大类&#xff1a; 1&#xff09; 公认端口&#xff08;Well Known Ports&#xff09;&#xff1a;从0到1023&#xff0c;它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服 务的协议。例如&#xff1a;80端口实际上总是HTTP通讯。 2&#xff09; 注册端…