扯兩句 MVC 的設計模式
一個app開發的主要流程可以簡單概括為:
搭建UI介面—> 請求伺服器資料 —> 把資料展示在UI介面上 –> 處理UI介面的業務邏輯 —> 測試及優化
在程式設計世界裡面大家都知道一句話: 高內聚,低耦合
- 高內聚,就是指儘量讓一個類或者一個方法它專門去處理一個事情,對外只提供一個介面,內部具體如何實現不需要告訴外界.
- 低耦合,就是減少類與類之間相互的依賴性,降低程式碼的入侵性,當改變一個類中的一個東西時候,不需要另一個類中也大批量改.
我們在請求網路資料的時候,通常伺服器給我們返回都是json或者xml資料,我們利用第三方框架將它解析之後會得到一個字典陣列.
這時候如果我們面向字典來開發:
1.這樣不太符合我們面向物件
2.由於xcode的原因,在敲字典的key時候系統是不會給我們提示(也就是自動聯想功能)的,這樣容易造成我們有時候不小心敲錯了一個key導致載入不出資料,但是系統又不會報錯,程式碼一多很可能就要花很多時間去找八哥(bug),專業點來講就是容錯率低.
所以為了順應社會主義發展的步伐,我們需要將字典陣列轉換為模型陣列,也就是將字典轉為模型, 這就要扯到MVC這個設計模式了.
MVC是三個單詞的首字母縮寫, 他們分別是 , 他們分別是, 分別是Model, View, Controller, 也就是模型, 檢視, 控制器.
- Model : 繼承NSObject, 負責儲存資料.
- View : 檢視控制元件, 通常用xib來描述它裡面的子控制元件,負責將資料展示在UI介面上
- Controller : 控制器,負責請求及處理網路資料, 處理使用者互動
他們三兄弟的關係如下:
這樣子,他們三個各司其職, 符合我們高內聚,低耦合的思想.
下面用簡單的table view例項來闡述一下MVC的使用,如下圖的效果
誰能教教我用markdown放入圖片怎麼設定圖片大小?
1.在Model(也叫Item)裡面定義屬性,用來儲存網路資料
123456789 | #import @interfacetagItem:NSObject@property(nonatomic,strong)NSString *image_list;@property(nonatomic,strong)NSString *sub_number;@property(nonatomic,strong)NSString *theme_name;@end |
2.在Controller裡面,請求資料,用第三方框架把資料轉化成模型存進Model這個類中, 然後給cell的item屬性賦值,這樣子就可以把item(資料)傳進View裡面——簡單的說,就是在Controller裡面把資料傳進View裡面
1234567891011121314151617181920212223242526 | //傳送網路請求-(void)loadData{AFHTTPSessionManager *mgr=[AFHTTPSessionManager ljw_manager];NSMutableDictionary *parameters=[NSMutableDictionary dictionary];parameters[@"a"]=@"tag_recommend";parameters[@"action"]=@"sub";parameters[@"c"]=@"topic";self.mgr=mgr;[mgr GET:@"http://api.budejie.com/api/api_open.php"parameters:parameters progress:nil success:^(NSURLSessionDataTask *_Nonnull task,NSDictionary *_Nullable responseObject){//字典陣列轉模型陣列_tags=[tagItem mj_objectArrayWithKeyValuesArray:responseObject];[self.tableView reloadData];[SVProgressHUD dismiss];}failure:^(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error){NSLog(@"%@",error);[SVProgressHUD dismiss];}];} |
1234567891011121314151617181920212223 | #pragma mark - Table view data source//設定cell的高度-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{return60+10;}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return_tags.count;}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{LJWAllTableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];tagItem *item=_tags[indexPath.row];//把資料傳給cellcell.item=item;returncell;} |
3.在View裡面描述好xib,
然後定義item這個屬性,並把各子控制元件拖好線,
重寫item這個屬性的getter方法(因為在控制器中給item屬性賦值時候就會呼叫這個方法), 在這個setter方法中用這個item的各個屬性來給View的子控制元件賦值, 達到把資料展示在UI介面上的目的—簡單來說就是在View裡面拿到Model資料,把資料展示在View上
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | #import "LJWAllTableViewCell.h"#import "tagItem.h"@interfaceLJWAllTableViewCell()@property(weak,nonatomic)IBOutlet UILabel *nameLabel;@property(weak,nonatomic)IBOutlet UILabel *numberLabel;@property(weak,nonatomic)IBOutlet UIImageView *imageV;@end-(void)setItem:(tagItem *)item{_item=item;//名字*********************_nameLabel.text=item.theme_name;//訂閱數******************NSString *numStr=[NSString stringWithFormat:@"%@人訂閱",_item.theme_name];CGFloat num=[_item.sub_number floatValue];if(num>10000){num=num/10000;numStr=[NSString stringWithFormat:@"%.1f人訂閱",num];}_numberLabel.text=numStr;//圖片 ********************[_imageV sd_setImageWithURL:[NSURL URLWithString:_item.image_list]placeholderImage:[UIImage imageNamed:@"defaultUserIcon"]completed:^(UIImage *_Nullable image,NSError *_Nullable error,SDImageCacheType cacheType,NSURL *_Nullable imageURL){//生成圓形圖片//開啟上下文UIGraphicsBeginImageContextWithOptions(image.size,NO,0);//描述裁剪路徑UIBezierPath *path=[UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,image.size.width,image.size.height)];//設定裁剪區域[path addClip];//開始裁剪[image drawAtPoint:CGPointZero];//獲取裁剪後的圖片image=UIGraphicsGetImageFromCurrentImageContext();//關閉上下文UIGraphicsEndImageContext();_imageV.image=image;}]; |
大致思路就是這樣, 還有一些細節的業務邏輯之類的根據實際需要處理好就行.
用MVC在日後可以方便地對程式碼進行維護, 可以達到”哪裡出問題,就去找對應的類修改”的效果.
下一篇將寫MVVM的設計模式.
相關推薦
扯兩句 MVC 的設計模式
一個app開發的主要流程可以簡單概括為: 搭建UI介面—> 請求伺服器資料 —> 把資料展示在UI介面上 –> 處理UI介面的業務邏輯 —> 測試及優化 在程式設計世界裡面大家都知道一句話: 高內聚,低耦合 高內聚,就是指儘量讓一個類或者一個方法它
MVC學習系列-WebForm與asp.net MVC兩種設計模式區別、MVC設計模式基礎瞭解
ASP.NET 是一個開發框架,用於通過 HTML、CSS、JavaScript 以及伺服器指令碼來構建網頁和網站。ASP.NET 支援三種開發模式:Web Pages、MVC (Model View Controller) 以及 WebForm。下面首先區別比較一下Web
MVC設計模式在網站中的應用
設計 分享 階段 可用性 狀態 代碼 img 多個 如果 MVC設計模式在網站中的應用 以淘寶的購物車為例 一、結合六個基本質量屬性 可修改性 采用MVC設計模式的時候,可以將視圖、模型、控制器分析,將用戶動作、數據表示、應用數據分離開來,如果用戶需要以不同的視圖來展示,只
[Java][Web]Request 實現轉發和 MVC 設計模式
寫入 頁面 str quest 表示 請求轉發 但是 write att String data = "aaaaa"; request.setAttribute("data",data); // 將數據存在 request request.getRequestDispat
Java-MVC設計模式
客戶 image family control java mvc span 胖客戶端 jpg JavaWeb開發模式 C/S:客戶端 / 服務器 (胖客戶端) B/S:瀏覽器 / 服務器 (瘦客戶端) JavaBean: 就是一個普通類(實體bean),包
MVC設計模式
曲線 互動 關心 可用性 pan 多個 競爭對手 可維護 data- 在界面框架中,使用MVC的設計模式是最合適方式。為什麽這樣說呢?由於M是model的縮寫,就是表示模型意思。模型就是算法,業務邏輯。商業表示。這個是常常會變的,比方像銀行開發一個超市積分系統,對不同來
Qt MVC設計模式(五篇)
net details blog 模式 mvc設計模式 sdn .net 設計 mvc http://blog.csdn.net/qq_19672579/article/details/46952675http://blog.csdn.net/qq_19672579/art
Android與MVC設計模式
wikipedia 數據模型 後來 small 事先 wiki 兩個 修改 idt 寫在前面,之前做過一段時間移動開發,後來因為工作原因擱淺了,最新重新拿起Android權威編程指南學習,順道做個學習筆記。 首先呢,我想說無論是計算機科班出身還是培訓班出身,都聽說過高內聚
MVC設計模式用於用戶註冊表單提交到數據庫的中文亂碼問題
def tail post str fix clear trac csdn rfi 本文引用自:http://blog.csdn.net/wangchangshuai0010/article/details/12714575 java.sql.SQLException: I
MVC設計模式的優缺點
宋體 ont mil 優點 控制器 實現 family font pan 1)優點: 各司其職、互不幹涉; 有利於開發中的分工; 有利於組建的重用; 2)缺點: 系統結構和實現復雜; 視圖與控制器過於緊密; 不適用於小型甚至中型應用程序;MVC設計模式的優缺點
MVC設計模式-學習筆記
MVC設計模式-學習筆記1)如果嚴格按照MVC思想的話,瀏覽器首頁訪問的是控制器,然後再由控制器轉發到視圖2)位於WEB-INF/目錄下的資源,客戶端無法直接訪問,只能通過服務端轉發進入3)request對象也可用於資源的轉發request.getRequestDispatcher("/WEB-IN
javaweb三大框架和MVC設計模式
detail struts2 萬能 sdn 發的 struts 其他 article 改進 javaweb三大框架和MVC設計模式 轉載,原文請見https://blog.csdn.net/sunpeng19960715/article/details/50890705 一
MyEclipse下用struts框架實現MVC設計模式
MyEclipse下用struts框架實現MVC設計模式 環境配置 Ø JDK 5.0 Ø Eclipse 3.2 Ø MyEclipse 5
2018-10-12 MVC設計模式
MVC是軟體開發行業比較經典的設計模式,是一種程式碼開發的思想和套路。 將要實現的某個功能分成三個部分: V:View [檢視層] 也就是介面,主要負責和和使用者進行輸入輸出的互動; C:Controller [控制層],主要負責處理該功能的邏輯部分; M:M
MVC設計模式和MVC架構的區別
mvc設計模式和mvc框架的區別 一組概念需要先理解,因為後面需要用: **架構:**簡單的說架構就是一個藍圖,是一種設計方案,將客戶的不同需求抽象成為抽象元件,並且能夠描述這些抽象元件之間的通訊和呼叫。 **框架:**軟體框架是專案軟體開發過程中提取特定領域軟體的共性部分形成的體系結構,不
javaweb之MVC設計模式
1.MVC簡介 MVC是Model-View-Controller的簡稱,即模型-檢視-控制器。MVC是一種設計模式,它把應用程式分成三個核心模組:模型,檢視,控制器,它們各自處理自己的任務。 模型(體現在下圖中的POJO和資料庫)是應用程式的主體部分,表示業務資料和業務邏輯。一個模型能為多個檢視提
JavaWeb學習筆記及案例(二)MVC設計模式
1.MVC三層架構 M:Model>>>模型層:封裝資料Java Bean; V:View>>>檢視層:jsp專注顯示; C:Controller>>>控制層:Servlet接收頁面請求,找模型層處理,然後響應資料出去; **好處:*
談談JAVA工程獅面試中經常遇到的面試題目------什麼是MVC設計模式
轉載來源:https://www.cnblogs.com/selene/p/4506962.html 作為一名java工程獅,大家肯定經歷過很多面試,但每次幾乎都會被問到什麼是MVC設計模式,你是怎麼理解MVC的類似這樣的一系列關於MVC的問題。 【出現頻率】 【關鍵考點】
Java——Web開發之開源框架DBUtils的使用,JSP開發模式,三層架構與MVC設計模式的認識
DBUtils的使用: 在使用開源框架DBUtils時,它只是幫我們簡化了CRUD的程式碼,但是它不負責連線的建立以及獲取工作。 1.和使用開源框架都一樣的一個步驟,先匯入jar檔案 2.在這裡採用的是開源資料庫連線池C3P0進行連線 3.編寫CRUD程式碼 使用其功