您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: