Obj-C 实现设计模式 -- Observer

观察者模式,采用气象站的例子来说明,本质上跟Java来实现差不多。只不过是针对协议(Delegate)来编程。

简单说下需求,气象显示版向气象站注册成功订阅者(观察者),气象站监测到气温发生变化,向各个已注册的气象显示版发出通知。

遵守针对接口编程的原则,先来写Delegate.

第一个,需要被气象站实现的订阅和取消订阅的方法。

#import "ObserverModel.h"@protocol SubjectProtocol <NSObject>- (void) registerObserver:(id<ObserverModel>) obs;
- (void) removeObserver:(id<ObserverModel>) obs;
- (void) notifyObservers;@end

上面被register和remove的是一个实现了ObserverModel的对象。

@protocol ObserverModel <NSObject>
- (void) updateWithTemp:(float) temp withHumidity:(float)humidity withPressure:(float)pressure;
@end@protocol DisplayDelegate <NSObject>
- (void) display;
@end

OK,下面进行气象站的具体编码。气象站需要四个属性,温度、湿度、气压、订阅者集合。

@interface WeatherData : NSObject <SubjectProtocol>{NSMutableArray * _objArray;float  _tempurature;float  _humidity;float  _pressure;  
}
@property (nonatomic, retain) NSMutableArray * objArray;
@property (nonatomic, assign) float tempurature;
@property (nonatomic, assign) float humidity;
@property (nonatomic, assign) float pressure;- (id) initWithArray;
- (void) registerObserver:(id<ObserverModel>)obs;
- (void) removeObserver:(id<ObserverModel>)obs;
- (void) notifyObservers;
- (void) measurementChanged;
- (void) setMeasurementsWithTemp:(float)temp withHumidity:(float)humidity withPressure:(float)pressure;
@end

对应方法的实现,

@synthesize objArray = _objArray;
@synthesize humidity = _humidity;
@synthesize tempurature = _tempurature;
@synthesize pressure = _pressure;- (id) initWithArray{self = [super init];if (self) {_objArray = [[NSMutableArray alloc] initWithCapacity:10];}return self;
}- (void) registerObserver:(id<ObserverModel>)obs{[_objArray addObject:obs];
}- (void) removeObserver:(id<ObserverModel>)obs{int i = [_objArray indexOfObject:obs];if (i>=0) {[_objArray removeObjectAtIndex:i];}
}- (void) notifyObservers{for (int i = 0; i < [_objArray count]; ++i) {id<ObserverModel> obj = (id<ObserverModel>)[_objArray objectAtIndex:i];[obj updateWithTemp:_tempurature withHumidity:_humidity withPressure:_pressure];}
}- (void) measurementChanged{[self notifyObservers];
}- (void) setMeasurementsWithTemp:(float)temp withHumidity:(float)humidity withPressure:(float)pressure{_tempurature = temp;_humidity = humidity;_pressure = pressure;[self measurementChanged];
}

气象显示板的实现,初始化的时候应该把气象站出入,使得该气象显示板决定是否向气象显示板注册订阅气象。

@interface CurrentConditionsDisplay : NSObject <ObserverModel,DisplayDelegate>{float _temperature;float _humidity;id<SubjectProtocol> _weatherData;
}
- (void) CurrentConditionsDisplayWithObj:(id<SubjectProtocol> ) weatherData;
- (void) updateWithTemp:(float)temp withHumidity:(float)humidity withPressure:(float)pressure;
@end

同时,显示板应该实现接口中的属性更新方法和显示方法。

- (void) CurrentConditionsDisplayWithObj:(id<SubjectProtocol> ) weatherData{_weatherData = weatherData;[weatherData registerObserver:self];
}
- (void) updateWithTemp:(float)temp withHumidity:(float)humidity withPressure:(float)pressure{_temperature = temp;_humidity = humidity;[self display];
}- (void) display{NSLog(@"Temperature is %f and Humidity is %f",_temperature,_humidity);
}

最后,进行整体的实例化,看看气象站是不是能正常工作了。

WeatherData * weatherData = [[WeatherData alloc] initWithArray];
CurrentConditionsDisplay * cCD = [[CurrentConditionsDisplay alloc] init];
[cCD CurrentConditionsDisplayWithObj:weatherData];
[weatherData setMeasurementsWithTemp:20.0 withHumidity:22.0 withPressure:24.0];
[weatherData setMeasurementsWithTemp:30.0 withHumidity:32.0 withPressure:34.0];

转载于:https://www.cnblogs.com/andywordsworth/archive/2012/04/12/2445019.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

影响员工敬业度的三大因素

敬业的员工通常业绩比较突出&#xff0c;对企业做的贡献很大。经理人当然希望自己的员工个个都是敬业的员工&#xff0c;但实际上&#xff0c;在中国只有8%的员工具有敬业精神&#xff0c;相比全球的平均水平14%还有很大的差距。 是什么因素造成员工不敬业呢&#xff1f;根据世…

cf914D. Bash and a Tough Math Puzzle(线段树)

题意 题目链接 Sol 直接在线段树上二分 当左右儿子中的一个不是\(x\)的倍数就继续递归 由于最多递归到一个叶子节点&#xff0c;所以复杂度是对的 开始时在纠结如果一段区间全是\(x\)的两倍是不是需要特判&#xff0c;实际上是不需要的。 可以这么想&#xff0c;如果能成功的话…

计算机答辩答不上来怎么回答,答辩答不上来怎么办

论文答辩成为了不少同学的最后一次考试&#xff0c;从开题报告、论文定稿到格式排版大家一定都花费了大量的时间和精力&#xff0c;然而有时也会有一点小错误。所以&#xff0c;答辩前怎么准备&#xff0c;答辩的时候应该怎么灵活表现才能让自己最有可能通过答辩呢&#xff1f;…

urllib2.urlopen超时问题

urllib2.urlopen超时问题 没有设置timeout参数&#xff0c;结果在网络环境不好的情况下&#xff0c;时常出现read()方法没有任何反应的问题&#xff0c;程序卡死在read()方法里&#xff0c;搞了大半天&#xff0c;才找到问题&#xff0c;给urlopen加上timeout就ok了&#xff0c…

git 关联远程分支

问题解析&#xff1a; git本地新建一个分支后&#xff0c;必须要做远程分支关联。如果没有关联&#xff0c; git 会在下面的操作中提示你显示的添加关联。关联目的是如果在本地分支下操作&#xff1a; git pull, git push &#xff0c;不需要指定在命令行指定远程的分支&#x…

Sql Server 常用日期格式

http://www.cnblogs.com/waitu/archive/2006/01/16/318299.html 转载于:https://www.cnblogs.com/passrift/archive/2006/09/29/517939.html

del服务器能装win7系统吗,500系列主板能不能装win7?500系列主板装win7教程(支持11代)...

今年intel发布了第十一代酷睿cpu&#xff0c;当前有些网友还停留在win7时代&#xff0c;对win7是恋恋不忘&#xff0c;以前经常听到讨论是400系列主板安装win7的问题&#xff0c;到了2021年我们应该换一个话题&#xff0c;就是500系列主板能安装win7吗&#xff1f;小编在这里可…

代码可读性心理学

写在前面的话&#xff1a; 这周末我一个同学在群上说找到一篇挺有意思的文章&#xff08;就是下面要说的可读性代码的心理学&#xff09;&#xff0c;说要翻译出来&#xff0c;我就主动请缨了&#xff0c;跟他合作翻译这篇文章&#xff0c;在看这篇文章的同时&#xff0c;我突然…

带图片的,多列的DropDownList的实现

下面是模仿的DropDownList的效果&#xff0c;支持图片&#xff0c;多列&#xff0c;换行等。查看例子 WebDropDownList.aspx 模拟下拉列表框模拟下拉框请选择&#xff1f;6北京市上海市河南省深圳市大连市云南省WebDropDownList.aspx.cs using System; using System.Collection…

手机连接服务器传文件在哪里,手机云服务器传文件在哪里

手机云服务器传文件在哪里 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。如果私钥文件丢失了&#xff0c;可以为服务器替换新的密…

本周ASP.NET英文技术文章推荐[03/25 - 03/31]

摘要 本期共有6篇文章&#xff1a; ASP.NET AJAX&#xff1a;客户端事件查看器JavaScript和.NET中的JavaScript对象标记&#xff08;JSON&#xff09;介绍在ASP.NET 2.0应用程序中使用NHibernate和Log4Net在数据Web控件中显示二进制数据为什么异步回送时不能使用文件上传&…

忙的日子

很久没有这么正儿八经的忙了&#xff0c;脑子里很多事的日子忽然觉得很不适应。两个人的工作都算尘埃落定&#xff0c;也许是忧患意识持续得太久了&#xff0c;没有太多的惊喜和踏实&#xff0c;却想着福兮祸之所依。很久不做梦了&#xff0c;忽然有梦时却总是校园里那些人那些…

虚拟机服务器断网,Vmware虚拟机断网不能上网的解决方法教程[多图]

vmware虚拟机不能上网怎么办&#xff1f;正常来说在给虚拟机安装了系统之后&#xff0c;虚拟机是可以共享电脑的网络进行上网的&#xff0c;但是最近有用户反映vmware虚拟机出现不能上网的问题&#xff0c;这该怎么办呢&#xff1f;请看下文具体介绍。方法1&#xff1a;1、我们…

本周ASP.NET英文技术文章推荐[09/30- 07/13]:.NET Framework、JSON、Google Analytics、文件上传、GridView、IIS 7、Web开发...

摘要 本期共有9篇文章&#xff1a; .NET Framework源代发发布Tip/Trick&#xff1a;在.NET 3.5中编写ToJSON扩展方法在Google Analytics中统计访客浏览器的Silverlight启用状况使用文本编辑器开发并部署ASP.NET Web应用程序在ASP.NET 2.0中编写类似Gmail的文件上传系统各种非…

深入剖析Redis系列(四) - Redis数据结构与全局命令概述

前言Redis 提供了 5 种数据结构。理解每种数据结构的特点&#xff0c;对于 Redis 的 开发运维 非常重要&#xff0c;同时掌握 Redis 的 单线程命令处理 机制&#xff0c;会使 数据结构 和 命令 的选择事半功倍。接下来的几篇文章&#xff0c;将从如下几个方面介绍 Redis 的几种…

网易云服务器上传文件,网易云音乐怎么把音乐上传到云盘 网易云音乐把音乐上传到云盘的步骤方法...

现在很多用户保存文件都会选择保存到网盘&#xff0c;喜欢的音乐也是一样&#xff0c;网易云音乐早已引入了云盘功能&#xff0c;不过上传的方法相信有很多朋友都不知道&#xff0c;下面小编为大家带来网易云音乐把音乐上传到云盘的步骤方法&#xff0c;感兴趣的朋友可以进来了…

MOSS 2007基础:内容类型(Content Type)之二

原文地址&#xff1a;http://www.msd2d.com/Content/Tip_viewitem_03NoAuth.aspx?ida14f3443-c394-4950-a048-8394bcce749b&sectionSharepoint 上次&#xff0c;我们说到MOSS 2007中的内容类型。下面我们将继续该话题&#xff0c;更深入了解其特性。在开始之前&#xff0c…

7.18 collection random os sys等模块

7.18 collection random os sys等模块 collection模块 应用场景1 # 具名元组 # 想表示坐标点x为1 y为2 z为5的坐标 from collections import namedtuple # point namedtuple(坐标,[x,y,z]) # 第二个参数既可以传可迭代对象 point namedtuple(坐标,x y z) # 也可以传字符串 …

结对作业

1、要求地址 博客要求地址&#xff1a;https://www.cnblogs.com/happyzm/p/9626779.htmlFork码云项目地址&#xff1a;https://gitee.com/YeHei/PairProject-Java/tree/master结对伙伴&#xff1a;余硕铭 博客地址&#xff1a;https://gitee.com/hellolv/PersonalProject-Java2…

leetcode(34)在排序数组中查找元素的第一个和最后一个位置

在排序数组中查找元素的第一个和最后一个位置 class Solution {public int[] searchRange(int[] nums, int target) {int len nums.length;int start 0;int end len - 1;int mid 0;int temp 0;while(start<end){mid (startend)/2;if(nums[mid]>target){end mid - …