zoukankan      html  css  js  c++  java
  • 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

           

       

  • 相关阅读:
    【转】微信中MMAlert(半透明底部弹出菜单)的使用介绍
    工厂模式
    装饰者模式
    观察者模式
    策略模式
    Android 自定义ViewGroup,实现侧方位滑动菜单
    【转】Android Android属性动画深入分析
    Android ActionBar仿微信界面
    书籍:《沧浪之水》、《盜墓筆記1-8全集》、《鬼 吹 灯(1-8加续)》、《流浪地球》、《二号首长1-5》
    FROM_UNIXTIME 格式化MYSQL时间戳函数
  • 原文地址:https://www.cnblogs.com/zhaochaobin/p/5236670.html
Copyright © 2011-2022 走看看