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
时间: 2024-10-20 13:43:05

oc的复合模式的相关文章

MVC模式 - 一种复合模式

MVC模式可以说是我们从事WEB开发人员最常见的模式 实际上,它是复合模式,一种由2个及以上的设计模式组成的设计模式 实际上是三个组件组成的模式,数据模型.视图.控制器 可以看得出来,实际上MVC是由观察者.组合.策略模式所组成的复合模式

复合模式Compound -- 学习HeadFirst设计模式记录

? 复合模式:结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题. ? 典型应用:MVC模式,M:Model, V:View, C:Controller.类似的还有Web:浏览器/服务器模型. ? ?

Java 设计模式 -- 复合模式之一

关于复合模式: 在形式上,复合模式确实是多个模式的组合,但满足了这一条并不一定是复合模式,注意它的定义:将多个模式结合起来形成一个"框架",以解决一般性问题             一提到"框架",可能最容易联想到的就是MVC吧,不过MVC确实是一个经典的复合模式 在进去MVC模式之前 先看一个简单的例子: 例子来自Headfrist 设计模式中的经典鸭鸣:有四种鸭鸣, 绿头鸭,叫声 Quack 红头鸭,叫声 Quack 鸭鸣器,叫声 Kwak 橡皮鸭,叫声 Squ

Effective Item 11 - 复合模式优于继承

继承是实现代码重用的方法之一,但使用不当则会导致诸多问题. 继承会破坏封装性,对一个具体类进行跨包访问级别的继承很危险. 即,子类依赖父类的实现细节. 如果父类的实现细节发生变化,子类则可能遭到破坏. 举个例子,扩展HashSet,记录HashSet实例创建以来一共进行了多少次添加元素的操作. HashSet有两个添加元素的方法--add(E e)和addAll(Collection<? extends E> c). 那就覆盖这两个方法,在添加操作执行前记录次数: public class I

Java 设计模式 -- 复合模式之二

接着上文的鸭鸣例子:Java 设计模式 -- 复合模式之一 上文中,我们的鸭鸣实现了 装饰者模式  适配器模式  工厂模式的结合 现在,又需要进行改动了,上文,是可以统计一群鸭子的叫声,现在需要能够观察个别鸭子的行为 引入观察者模式: 任何想被观察的Quackable都必须实现下面的接口 public interface QuackObservable { public void registerObserver(Observer observer); public void notifyobs

复合模式——MVC(model-view-controller)

设计时,尽可能用最简单的方式解决问题,你的目标应该是简单,而不是“在这个问题中使用模式”. 为实际需要的扩展使用模式,不要只是为了假想的需求而使用模式.模式是工具而不是规则. 模式通常被一起使用,并被组合在同一个设计解决方案中 复合模式是一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题. 1. 用户和 视图交互 用户触发一系列事件,视图告诉控制器用户做了什么,控制器则负责处理. 2. 控制器 要求模型改变状态. 控制器也可能要求视图做出改变,(如令某些按钮失效). 3. 当模型状态改

用最简单的例子理解复合模式(Composite Pattern)

在显示树形结构时,复合模式有很好的体现.本篇显示如下部门结构: 以上,有的节点包含子节点,有的节点部包含子节点.不管是什么节点,每个节点就代表一个部门. 首先设计一个关于部门的抽象基类. public abstract class DepartmentComponent { public string Name { private set; get; } public DepartmentComponent(string name) { this.Name = name; } public vi

Effective Java - 复合模式优于继承

继承是实现代码重用的方法之一,但使用不当则会导致诸多问题. 继承会破坏封装性,对一个具体类进行跨包访问级别的继承很危险. 即,子类依赖父类的实现细节. 如果父类的实现细节发生变化,子类则可能遭到破坏. 举个例子,扩展HashSet,记录HashSet实例创建以来一共进行了多少次添加元素的操作. HashSet有两个添加元素的方法——add(E e)和addAll(Collection<? extends E> c). 那就覆盖这两个方法,在添加操作执行前记录次数: public class I

fishGUI:复合模式

问题: 图11-1和图11-2 参见 http://blog.csdn.net/u012829152/article/details/42172233:11-1的对象图中,fishGUI系统内与窗口元素相关的对象,在系统运行的某一刻构成了一个三层的属性结构,并显示了对象之间的包容关系:而在设计模型内与窗口元素相关的类图11-2中,所有类又构成了另一个树形的继承结构,这两个树形结构并不完全相同,如二者的层次数量不同,特定的类和它对应的对象实例在二者中的位置也不一致,如果设计模型无法反映这些差异,程