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.pswp.cn/news/277153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277153.shtml
英文地址,請注明出處:http://en.pswp.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 - …