MVC
C代表Controller,負責用戶界面和業務邏輯層的通信控制,一方面解釋來自用戶界面的輸入,識別用戶動作(如點擊按鈕等),調用相應Model中的方法,另一方面處理來自Model的事件和返回的執行結果,調用適當的View顯示給用戶,Controller主要由Servlet完成。
M代表Model,負責整個解決方案的業務邏輯實現,底層的數據庫也由Model訪問和操作;
V代表View,負責系統向用戶的展示,主要由HTML及JSP等完成-
工廠
工廠方法模式:定義創建對象的接口,讓子類決定實例化哪一個類。工廠方法使得一個類的實例化延遲到其子類。工廠的使用情景
- 編譯時無法準確預期要創建的對象的類;
- 類想讓子類決定在運行時創建什么;
- 類有若干輔助類為其子類,而你想將返回哪個子類這一信息局部話;
優缺點
優點:簡單工廠模式的優點是客戶端可以直接消費產品,而不必關心具體產品的實現,消除了客戶端直接創建產品對象的責任,實現了對責任的分割。
缺點: 是工廠類幾種了所有產品的創建邏輯,一旦不能正常工作,整個系統都會受到影響,而且當產品類多結構復雜的時候,把所有創建工作放進一個工廠中來,回事后期程序的擴展較為困難。
代理
代理的作用:完成委托方交給的任務,委托方有一些任務自己不想完成,但是還需要要實現,則將該任務存放到協議中,由代理完成.但是代理并不會主動的執行任務,需要委托方通知代理。KVO
一,概述
KVO,即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改后,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改后,KVO就會自動通知相應的觀察者了。
二,使用方法
系統框架已經支持KVO,所以程序員在使用的時候非常簡單。
- 注冊,指定被觀察者的屬性,
- 實現回調方法
- 移除觀察
三,實例:
假設一個場景,股票的價格顯示在當前屏幕上,當股票價格更改的時候,實時顯示更新其價格。
1.定義DataModel,
[cpp] view plain copy
@interface StockData : NSObject
{
NSString * stockName;
float price;
}
@end
@implementation StockData
@end
2.定義此model為Controller的屬性,實例化它,監聽它的屬性,并顯示在當前的View里邊
[cpp] view plain copy
- (void)viewDidLoad
{
[super viewDidLoad];
stockForKVO = [[StockData alloc] init];
[stockForKVO setValue:@"searph" forKey:@"stockName"];
[stockForKVO setValue:@"10.0" forKey:@"price"];
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
myLabel.textColor = [UIColor redColor];
myLabel.text = [stockForKVO valueForKey:@"price"];
[self.view addSubview:myLabel];
UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
b.frame = CGRectMake(0, 0, 100, 30);
[b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:b];
}
3.當點擊button的時候,調用buttonAction方法,修改對象的屬性
[cpp] view plain copy
-(void) buttonAction
{
[stockForKVO setValue:@"20.0" forKey:@"price"];
}
-
實現回調方法
[cpp] view plain copy -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"price"]) { myLabel.text = [stockForKVO valueForKey:@"price"]; } }
5.增加觀察與取消觀察是成對出現的,所以需要在最后的時候,移除觀察者
[cpp] view plain copy
- (void)dealloc
{
[super dealloc];
[stockForKVO removeObserver:self forKeyPath:@"price"];
[stockForKVO release];
}
四,小結
KVO這種編碼方式使用起來很簡單,很適用與datamodel修改后,引發的UIVIew的變化這種情況,就像上邊的例子那樣,當更改屬性的值后,監聽對象會立即得到通知。