zoukankan      html  css  js  c++  java
  • iOS开发-观察者模式

    观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。iOS开发中最明显的观察者模式就是KVO键值对观察,如果对于KVC和KVO不是很熟悉,可以参考本人之前博客iOS开发-KVC和KVO的理解

    关于设计模式网上的介绍多如牛毛,参考资料随手可查,简单的使用OC实现一下观察者模式,我们举一个实际工作的例子,猎头和程序员的故事,简单的就是一个猎头手里面有多个候选人的信息,一旦公司有新的工作机会,会通知所有的候选人,基于以上信息,我们通过观察者模式很容易实现。

    主题对象基类:

    @interface Subject : NSObject
    
    -(void)registerObserver:(id)observer;
    
    -(void)deleteObserver:(id)observer;
    
    -(void)notifyObservers;
    
    @end
    
    @interface Subject()
    
    @property  (strong,nonatomic)  NSMutableArray  *observers;
    
    @end
    
    @implementation Subject
    
    
    -(void)registerObserver:(id)observer{
        [self.observers addObject:observer];
    }
    
    -(void)deleteObserver:(id)observer{
        [self.observers removeObject:observer];
    }
    
    -(void)notifyObservers{
        for (NSInteger i=0; i<[self.observers count]; i++) {
            Observer  *observer=(Observer *)[self.observers objectAtIndex:i];
            [observer updateState:self observer:observer];
        }
    }
    
    //getter and  setter
    -(NSMutableArray *)observers{
        if(!_observers){
            _observers=[[NSMutableArray alloc]init];
        }
        return _observers;
    }
    
    @end
    

    猎头(Hunter)实现基类:

    @implementation Hunter
    
    -(void)updateInfo:(NSString *)personName{
        self.personName=personName;
        [self notifyObservers];
    }
    
    @end
    

    观察者(Observer)基类:

    @interface Observer : NSObject
    
    -(void)updateState:(id)subject  observer:(id)observer;
    
    @end
    

    程序员(Programmer)定义:

    @interface Programmer :Observer
    
    @property  (strong,nonatomic) NSString  *programmerName;
    
    -(instancetype)initWithName:(NSString *)name;
    
    @end
    
    @implementation Programmer
    
    -(instancetype)initWithName:(NSString *)name{
        self=[super init];
        if (self) {
            self.programmerName=name;
        }
        return self;
    }
    //原文地址:http://www.cnblogs.com/xiaofeixiang/
    -(void)updateState:(id)subject observer:(id)observer{
        NSLog(@"伙计们,XX要招聘了,有意的赶紧联系我");
        Hunter *hunter=(Hunter *)subject;
        Programmer  *programmer=(Programmer *)observer;
        NSLog(@"%@---%@",hunter,programmer);
    }
    
    @end
    

    测试观察者效果:

            Hunter  *hunter=[[Hunter alloc]init];
            Programmer *programmer=[[Programmer alloc]initWithName:@"iOS开发工程师"];
            NSLog(@"博客园-FlyElephant");
            [hunter registerObserver:programmer];
            [hunter updateInfo:@"原文地址:http://www.cnblogs.com/xiaofeixiang/"];
            [hunter deleteObserver:programmer];
            [hunter updateInfo:@"iOS技术交流:228407086"];
    

      

    测试一切OK,如有不当,欢迎讨论~

  • 相关阅读:
    一个简易的四则运算单元...(15.12.15 BUG更新)
    转一个PDevMode格式属性说明...
    正则表达式语法
    模拟键盘发送文字
    一个修改过简化版的InputQuery
    获取进程列表的单元
    获取EMF文件内全部文字, 并按照左上到右下的顺序排序
    非主窗体在任务栏显示按钮
    禁用窗体关闭按钮
    一个支持FMX.Win框架的托盘控件
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/5084224.html
Copyright © 2011-2022 走看看