Head First设计模式—观察者模式
2015-10-03 23:20
399 查看
这是我自己用Objective-c重写Head-First设计模式中第二章观察者模式,直接上代码吧:
Observer协议声明
#import <Foundation/Foundation.h>
@protocol Observer <NSObject>
- (void)update:(float)aTemp humidity:(float)aHumidity pressure:(float)aPressure;
@end
DisplayElement协议声明
#import <Foundation/Foundation.h>
@protocol DisplayElement <NSObject>
- (void)display;
@end
Subject协议声明
#import <Foundation/Foundation.h>
#import "Observer.h"
@protocol Subject <NSObject>
- (void)registerObserver:(id<Observer>)aObserver;
- (void)removeObserver:(id<Observer>)aObserver;
- (void)notifyObserver;
@end
实现了Observer,DisplayElement协议的类CurrentConditionDisplay的头文件和实现:
#import <Foundation/Foundation.h>
#import "Observer.h"
#import "DisplayElement.h"
#import "Subject.h"
#import "CurrentConditionDisplay.h"
@interface CurrentConditionDisplay :
NSObject<Observer,DisplayElement>{
float temperature;
float humidity;
float pressure;
id<Subject> weatherData;
}
@property(nonatomic)float temperature;
@property(nonatomic)float humidity;
@property(nonatomic)float pressure;
@property(nonatomic)id<Subject>weatherData;
- (id)initWithWeatherData:(id<Subject>)aWeatherData;
- (void)update:(float)aTemp humidity:(float)aHumidity pressure:(float)aPressure;
- (void)display;
@end
#import "CurrentConditionDisplay.h"
@implementation CurrentConditionDisplay
@synthesize temperature,humidity,pressure,weatherData;
- (id)initWithWeatherData:(id<Subject>)aWeatherData{
if (self = [superinit]) {
weatherData = aWeatherData;
[weatherDataregisterObserver:self];
}
return
self;
}
- (void)update:(float)aTemp humidity:(float)aHumidity pressure:(float)aPressure{
temperature = aTemp;
humidity = aHumidity;
pressure = aPressure;
[self display];
}
- (void)display{
NSLog(@"Current conditions:%f F degrees and %f hmiditiy and %f pressure",temperature,humidity,
pressure);
}
@end
实现了Subject协议的类WeatherData的头文件和实现:
#import <Foundation/Foundation.h>
#import "Subject.h"
#import "CurrentConditionDisplay.h"
@interface WeatherData :
NSObject<Subject>{
NSMutableArray *observers;
float temperature;
float humidity;
float pressure;
}
@property(nonatomic)float temperature;
@property(nonatomic)float humidity;
@property(nonatomic)float pressure;
-(id) init;
-(void) registerObserver:(id<Observer>)aObserver;
-(void) removeObserver:(id<Observer>)aObserver;
-(void) notifyObserver;
-(void) measuremethsChanged;
-(void) setMeasurements:(float)aTemperature humidity:(float)aHumidity pressure:(float)aPressure;
@end
#import "WeatherData.h"
@implementation WeatherData
@synthesize pressure,humidity,temperature;
-(id) init{
if(self = [superinit]){
observers = [NSMutableArrayarray];
}
return
self;
}
-(void) registerObserver:(id<Observer>)aObserver{
[observers addObject:aObserver];
}
-(void) removeObserver:(id<Observer>)aObserver{
[observers removeObject:aObserver];
}
-(void) notifyObserver{
for(CurrentConditionDisplay *subjectin
observers){
[subject update:temperaturehumidity:humiditypressure:pressure];
}
}
-(void) measuremethsChanged{
[selfnotifyObserver];
}
-(void) setMeasurements:(float)aTemperature humidity:(float)aHumidity pressure:(float)aPressure{
temperature = aTemperature;
humidity = aHumidity;
pressure = aPressure;
[selfmeasuremethsChanged];
}
@end
主函数实现:
#import <Foundation/Foundation.h>
#import "CurrentConditionDisplay.h"
#import "WeatherData.h"
int main(int argc,const
char * argv[]) {
@autoreleasepool {
WeatherData *weatherData = [[WeatherDataalloc]
init];
CurrentConditionDisplay *currentDisplay = [[CurrentConditionDisplayalloc]
initWithWeatherData:weatherData];
[weatherData setMeasurements:80humidity:65pressure:30.4f];
}
return 0;
}
图片是最后结果,这个实现比较简单,问题不大,有什么关于objective-c的问题,请留言交流。
——Rocky
Observer协议声明
#import <Foundation/Foundation.h>
@protocol Observer <NSObject>
- (void)update:(float)aTemp humidity:(float)aHumidity pressure:(float)aPressure;
@end
DisplayElement协议声明
#import <Foundation/Foundation.h>
@protocol DisplayElement <NSObject>
- (void)display;
@end
Subject协议声明
#import <Foundation/Foundation.h>
#import "Observer.h"
@protocol Subject <NSObject>
- (void)registerObserver:(id<Observer>)aObserver;
- (void)removeObserver:(id<Observer>)aObserver;
- (void)notifyObserver;
@end
实现了Observer,DisplayElement协议的类CurrentConditionDisplay的头文件和实现:
#import <Foundation/Foundation.h>
#import "Observer.h"
#import "DisplayElement.h"
#import "Subject.h"
#import "CurrentConditionDisplay.h"
@interface CurrentConditionDisplay :
NSObject<Observer,DisplayElement>{
float temperature;
float humidity;
float pressure;
id<Subject> weatherData;
}
@property(nonatomic)float temperature;
@property(nonatomic)float humidity;
@property(nonatomic)float pressure;
@property(nonatomic)id<Subject>weatherData;
- (id)initWithWeatherData:(id<Subject>)aWeatherData;
- (void)update:(float)aTemp humidity:(float)aHumidity pressure:(float)aPressure;
- (void)display;
@end
#import "CurrentConditionDisplay.h"
@implementation CurrentConditionDisplay
@synthesize temperature,humidity,pressure,weatherData;
- (id)initWithWeatherData:(id<Subject>)aWeatherData{
if (self = [superinit]) {
weatherData = aWeatherData;
[weatherDataregisterObserver:self];
}
return
self;
}
- (void)update:(float)aTemp humidity:(float)aHumidity pressure:(float)aPressure{
temperature = aTemp;
humidity = aHumidity;
pressure = aPressure;
[self display];
}
- (void)display{
NSLog(@"Current conditions:%f F degrees and %f hmiditiy and %f pressure",temperature,humidity,
pressure);
}
@end
实现了Subject协议的类WeatherData的头文件和实现:
#import <Foundation/Foundation.h>
#import "Subject.h"
#import "CurrentConditionDisplay.h"
@interface WeatherData :
NSObject<Subject>{
NSMutableArray *observers;
float temperature;
float humidity;
float pressure;
}
@property(nonatomic)float temperature;
@property(nonatomic)float humidity;
@property(nonatomic)float pressure;
-(id) init;
-(void) registerObserver:(id<Observer>)aObserver;
-(void) removeObserver:(id<Observer>)aObserver;
-(void) notifyObserver;
-(void) measuremethsChanged;
-(void) setMeasurements:(float)aTemperature humidity:(float)aHumidity pressure:(float)aPressure;
@end
#import "WeatherData.h"
@implementation WeatherData
@synthesize pressure,humidity,temperature;
-(id) init{
if(self = [superinit]){
observers = [NSMutableArrayarray];
}
return
self;
}
-(void) registerObserver:(id<Observer>)aObserver{
[observers addObject:aObserver];
}
-(void) removeObserver:(id<Observer>)aObserver{
[observers removeObject:aObserver];
}
-(void) notifyObserver{
for(CurrentConditionDisplay *subjectin
observers){
[subject update:temperaturehumidity:humiditypressure:pressure];
}
}
-(void) measuremethsChanged{
[selfnotifyObserver];
}
-(void) setMeasurements:(float)aTemperature humidity:(float)aHumidity pressure:(float)aPressure{
temperature = aTemperature;
humidity = aHumidity;
pressure = aPressure;
[selfmeasuremethsChanged];
}
@end
主函数实现:
#import <Foundation/Foundation.h>
#import "CurrentConditionDisplay.h"
#import "WeatherData.h"
int main(int argc,const
char * argv[]) {
@autoreleasepool {
WeatherData *weatherData = [[WeatherDataalloc]
init];
CurrentConditionDisplay *currentDisplay = [[CurrentConditionDisplayalloc]
initWithWeatherData:weatherData];
[weatherData setMeasurements:80humidity:65pressure:30.4f];
}
return 0;
}
图片是最后结果,这个实现比较简单,问题不大,有什么关于objective-c的问题,请留言交流。
——Rocky
相关文章推荐
- Qt快速入门学习笔记(基础篇)
- UGUI之布局的使用
- C# 中Parallel类的使用
- [经济学原理|政治部分]资本和剩余价值的具体形态理论
- 你应该知道的RPC原理
- Ubuntu下安装 Git 最新版本控制系统
- 深入浅出KMP算法
- 酒鬼随机漫步(一个矢量类)
- Windows Azure Virtual Machine (25) 使用SSH登录Azure Linux虚拟机
- 纯HTML5APP与原生APP的差距在哪?
- 纯HTML5APP与原生APP的差距在哪?
- 【C#】值类型VS引用类型and现金VS存折
- CSS:控制HTML页面超链接不显示下划线
- 转载的,刚装完 PyCharm , 却遇到“No Python interpreter selected”该怎么办
- 笔记:Oracle SQL 高级查询简介 (2) 分析函数
- Spring远程调用图解
- XAMPP 的安装配置(Linux 版)
- Hive笔记九:Hive输入输出适配类(CSV,XML)
- 自定义属性提取源码分析
- DirectX11 寻址模式