封裝

来源:http://www.cnblogs.com/Xebdison/archive/2016/04/28/5443000.html
-Advertisement-
Play Games

一.封裝 1.封裝的概念: 封裝,顧名思義,就是把什麼封起來,裝起來.在程式開發中,封裝是優化代碼,提高代碼安全性的一種做法,即是將不必要暴露在外界的代碼,封裝在一個類中,在外界只調用他.如果看到這裡還沒有明白的話,那麼請往下看: 比如:你買了一個手機,你可以用手機打電話,發信息,上網等等各種操作, ...


一.封裝

1.封裝的概念:

      封裝,顧名思義,就是把什麼封起來,裝起來.在程式開發中,封裝是優化代碼,提高代碼安全性的一種做法,即是將不必要暴露在外界的代碼,封裝在一個類中,在外界只調用他.如果看到這裡還沒有明白的話,那麼請往下看:

  比如:你買了一個手機,你可以用手機打電話,發信息,上網等等各種操作,但是你需要知道手機怎麼來實現這個功能的嗎?當然不用,你只需要知道怎麼使用它.再例如在開發中可能會用到第三方庫,比如你去Github上下了一個MJRefresh的庫,你需要知道這個庫是怎麼實現的麽?不用,你只需要知道你該怎麼使用它,這就是封裝.

 

2.代碼:

  這裡舉例用的是字典轉模型數據

2.1 KXZCar.h

 1 //
 2 //  KXZCar.h
 3 //  封裝
 4 //
 5 //  Created by admin on 16/4/28.
 6 //  Copyright © 2016年 admin. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 
11 @interface KXZCar : NSObject
12 /**
13  *  汽車名稱
14  */
15 @property (nonatomic,copy) NSString *name;
16 
17 /**
18  *  汽車的圖標
19  */
20 @property (nonatomic,copy) NSString *icon;
21 /**
22  *  汽車信息
23  */
24 @property (nonatomic, copy) NSString *info;
25 /**
26  *  產地
27  */
28 @property (nonatomic, copy) NSString *country;
29 //實現字典轉模型的方法
30 // 對象方法
31 - (instancetype) initWithDict:(NSDictionary *) dict;
32 
33 //類方法
34 + (instancetype) carWithDict:(NSDictionary *) dict;
35 @end

 

2.2 KXZCar.m

 1 //
 2 //  KXZCar.m
 3 //  封裝
 4 //
 5 //  Created by admin on 16/4/28.
 6 //  Copyright © 2016年 admin. All rights reserved.
 7 //
 8 
 9 #import "KXZCar.h"
10 
11 @implementation KXZCar
12 - (instancetype)initWithDict:(NSDictionary *)dict
13 {
14     if (self = [super init]) {
15         
16         self.icon = dict[@"icon"];
17         self.name = dict[@"name"];
18         self.country = dict[@"country"];
19         self.info = dict[@"info"];
20 //        KVC賦值
21 //        [self setValuesForKeysWithDictionary:dict];
22         
23     }
24     return self;
25 }
26 
27 + (instancetype)carWithDict:(NSDictionary *)dict
28 {
29     return [[self alloc] initWithDict:dict];
30 }
31 @end

 

2.3 KXZCarGroup.h

 1 //
 2 //  KXZCarGroup.h
 3 //  封裝
 4 //
 5 //  Created by admin on 16/4/28.
 6 //  Copyright © 2016年 admin. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 #import "KXZCar.h"
11 
12 @interface KXZCarGroup : NSObject
13 //標題
14 @property (nonatomic,copy) NSString *title;
15 //汽車數組
16 @property (nonatomic,strong) NSArray *cars;
17 
18 //提供兩個字典轉模型的方法
19 //對象方法
20 - (instancetype) initWithDict:(NSDictionary *) dict;
21 //類方法
22 + (instancetype) carGroupWithDict:(NSDictionary *) dict;
23 
24 //載入plist文件,把字典數組轉換為模型數組
25 + (NSArray *) carGroups;
26 @end

2.4 KXZCarGroup.m

 1 //
 2 //  KXZCarGroup.m
 3 //  封裝
 4 //
 5 //  Created by admin on 16/4/28.
 6 //  Copyright © 2016年 admin. All rights reserved.
 7 //
 8 
 9 #import "KXZCarGroup.h"
10 
11 @implementation KXZCarGroup
12 - (instancetype)initWithDict:(NSDictionary *)dict
13 {
14     if (self = [super init]) {
15         self.title = dict[@"title"];
16         self.cars = dict[@"cars"];
17     }
18     return self;
19 }
20 
21 
22 + (instancetype)carGroupWithDict:(NSDictionary *)dict
23 {
24     return [[self alloc] initWithDict:dict];
25 }
26 
27 
28 + (NSArray *)carGroups
29 {
30     //   1.載入plist
31     //   獲取絕對路徑
32     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cars_total" ofType:@"plist"];
33     //   讀取數組(分組的字典)
34     NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
35     
36     //  2.把array中分組的字典轉為模型
37     //  2.1 定義一個可變數組
38     NSMutableArray *arrayM = [NSMutableArray array];
39     //  遍歷array,把它裡面存放的組字典轉換為組模型,放到arrayM中
40     for (NSDictionary *dict in array) {
41         KXZCarGroup *carGroup  = [self carGroupWithDict:dict];
42         //      這個字典數組
43         NSArray *dictArray  = carGroup.cars;
44         //      把dictArray轉換為一個CZCar的模型數組
45         //      定義一個可變數組用來存放轉換後的CZCar模型
46         NSMutableArray *carsArray = [NSMutableArray array];
47         //      遍歷字典數組dictArray,把字典轉換為CZCar的模型
48         for (NSDictionary *dict in dictArray) {
49             //        把字典轉換為CZCar的模型
50             KXZCar *car  = [KXZCar carWithDict:dict];
51             //         把轉換後的car添加到carsArray數組中
52             [carsArray addObject:car];
53         }
54         //     把轉換後的CZCar的模型數組賦值給carGroup的cars屬性
55         carGroup.cars = carsArray;
56         
57         [arrayM addObject:carGroup];
58     }
59     // 3.返回組模型數組
60     return arrayM;
61 }
62 @end

3.plist文件如下:

4.BCViewController(就是一個普通的ViewController)

4.1代碼如下:

 1 //
 2 //  BCViewController.m
 3 //  封裝
 4 //
 5 //  Created by admin on 16/4/28.
 6 //  Copyright © 2016年 admin. All rights reserved.
 7 //
 8 
 9 #import "BCViewController.h"
10 #import "KXZTableViewCell.h"
11 #import "KXZCar.h"
12 #import "KXZCarGroup.h"
13 
14 @interface BCViewController ()<UITableViewDelegate,UITableViewDataSource>
15 @property (nonatomic, strong) UITableView *tableView;
16 @property (nonatomic, strong) UILabel *headLabel;
17 @property (nonatomic, strong) UIButton *clickButton;
18 @property (nonatomic, strong) NSArray *carGroups;
19 @end
20 
21 @implementation BCViewController
22 
23 -(NSArray *)carGroups{
24     if (_carGroups == nil) {
25         _carGroups = [KXZCarGroup carGroups];
26     }
27     return _carGroups;
28 }
29 @end

註:以為只介紹封裝,故不發tableView的實現了.

4.2說明:

在以上的代碼2.4中的38行開始,我定義了一個類方法,在類方法中實現了字典轉模型,然後在代碼4.1中的23行到28行的懶載入(延時載入)中,判斷數組是否為空,如果為空,就調用KXZCarGroup的類方法.在類方法中字典轉模型,外界(BCViewController中)我只需要調用一下這個類的方法去達到給數組carGroups賦值的目的,而不用知道裡面是怎麼去把字典轉成模型數據.

5.總結

封裝就是對一些不想要外界訪問到的成員變數,屬性和方法進行保護,不讓外界知道你內部是怎麼實現的.一般在封裝的過程中,還可以使用幾個關鍵字:protected(受保護的)-private(私有的)-public(公共的),如有不足,請兄弟們補充.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 自定義tableViewCell 1、獨立使用xib創建的cell不需要使用:註冊cell,不然會使用不了,如下代碼 [self.tableView registerClass:[ableViewCell class] forCellReuseIdentifier:@“actionCell"]; 問 ...
  • 怎樣在代碼文件中修改控制項的高低 有些時候使用setHight()或者setWidth()不管用就需要使用別的方法,下麵有一種方法 你使用的佈局.LayoutParams lp = new 你使用的佈局.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutPar ...
  • 1.前言: 今天再一次去蹭了一下某老師的android課,這一次講的是Android的SQLite的使用,老師當場講解了他自己做的例子。 回來之後,我春心萌動,不得不拿著參考資料再做了一個類似的例子,其實我已經過幾遍SQLite的內容了,但是認識還是不深刻。 2.SQLite繼承 要想使用SQLit ...
  • 變數類型:基本類型和引用類型 基本類型上節已經提到。基本類型的值是按值傳遞的,既改變形參的值不會影響實參 其中,a(x)為100 ,alert(x)為1 可見js的基本類型是按值傳遞的 引用類型:由多個值構成的對象,是按照共用傳遞的,也就是對象屬性的形參的改變會影響對象屬型的改變,對象形參的改變不會 ...
  • 請求方法 標準Http協議支持六種請求方法,即: 0,GET 1,HEAD 2,PUT 3,DELETE 4,POST 5,OPTIONS 但其實我們大部分情況下只用到了GET和POST。如果想設計一個符合RESTful規範的web應用程式,則這六種方法都會用到。不過即使暫時不想涉及REST,瞭解這 ...
  • 還不是很完全,目前只能點中間圖片才能位移,圖片外的其他區域沒有。。(屬性動畫),對了,圖片載入用得是facebook的一款android圖片載入庫,感覺非常NB啊,完爆一切。 1、先看佈局 2、主界面代碼 3、viewpager的適配器代碼 4、facebook的載入圖片的控制項 還不是很好,感興趣的 ...
  • HTTP原理 1 簡介 HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分散式超媒體信息系統。 HTTP協議的主要特點可概括如下: 1.支持客戶/伺服器模式。 2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規 ...
  • 通過/system/etc/media_codecs.xml可以確定當前設備支持哪些硬解碼。通過/system/etc/media_profiles.xml可以知道設備支持的具體profile和level等詳細信息。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...