OC 類簇與複合

来源:http://www.cnblogs.com/xubaoaichiyu/archive/2016/06/05/5483160.html
-Advertisement-
Play Games

OC 類簇與複合 類簇: 類簇是Foundation框架中廣泛使用的設計模式。類簇將一些私有的、具體的子類組合在一個公共的、抽象的超類下麵,以這種方法來組織類可以簡化一個面向對象框架的公開架構,而又不減少功能的豐富性。 簡單的來說,NSString是個“工廠類”,然後它在外層提供了很多方法介面,但是 ...


OC 類簇與複合


類簇:

類簇是Foundation框架中廣泛使用的設計模式。類簇將一些私有的、具體的子類組合在一個公共的、抽象的超類下麵,以這種方法來組織類可以簡化一個面向對象框架的公開架構,而又不減少功能的豐富性。

簡單的來說,NSString是個“工廠類”,然後它在外層提供了很多方法介面,但是這些方法的實現是由具體 的內部類來實現的。當使用NSString生成一個對象時,初始化方法會判斷哪個“自己內部的類”最適合生成這個對象,然後這個“工廠”就會生成這個具體的類對象返回給你。這種又外層類提供統一抽象的介面,然後具體實現讓隱藏的,具體的內部類來實現,在設計模式中稱為“抽象工廠”模式。

類簇實現的類不適宜繼承。(有關博客點擊下麵的連接)

IOS 雜筆-1(為什麼不繼承類簇?)

我在這裡實現了一個簡單的類簇:

//
//  CXString.m
//  類簇
//
//  Created by ma c on 16/5/11.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "CXString.h"

@interface cx1 : CXString

@end
@implementation cx1

- (void)method{
    
    NSLog(@"%s",__func__);
}

@end

@interface cx2 : CXString

@end
@implementation cx2

- (void)method{
    
    NSLog(@"%s",__func__);
}

@end

@implementation CXString

+ (CXString *)CXString1{
    
    cx1 * cx = [[cx1 alloc]init];
    
    return cx;
}

+ (CXString *)CXString2{
    
    cx2 * cx = [[cx2 alloc]init];
    
    return cx;
}


@end

上面的代碼並不是很難讀懂,就不做過多的解釋.

下麵我調用一下我所設計的'類簇'

//
//  ViewController.m
//  類簇
//
//  Created by ma c on 16/5/11.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"
#import "CXString.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    CXString * cx1 = [CXString CXString1];
    CXString * cx2 = [CXString CXString2];
    
    [cx1 method];
    [cx2 method];
    
}

@end

輸出結果
2016-05-11 18:01:14.643 類簇[3161:1545420] -[cx1 method]
2016-05-11 18:01:14.644 類簇[3161:1545420] -[cx2 method]

複合:

在OC的複合模式就是把其他對象作為自身的一部分,以提升自身的功能。換句話說複合是某一個複雜的類,需要由多個不同的類組成。

比如我現在要製作一臺電腦,電腦需要CPU,顯示器,滑鼠和鍵盤等。這些東西的研發都是很複雜的過程。如果現在有成型的CPU等組件,就可以直接用這些組件攢一臺電腦。複合模式就是這樣。
所有我們在製作電腦前要先找到這些組件。這些組件並不需要我們來製作,有專業的公司提供這些成型的組件。

這裡我做一個實例:電腦使用鍵盤和滑鼠

//
//  ViewController.m
//  複合
//
//  Created by ma c on 16/5/11.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"
#import "Computer.h"
#import "Keyboard.h"
#import "mouse.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    Computer * com = [[Computer alloc]init];
    
    Keyboard * key = [[Keyboard alloc]init];
    
    mouse * mou = [[mouse alloc]init];
    
    com.keyboard = key;
    com.mouse = mou;
    
    [com useMouse];
    [com useKeyboard];
    
}

@end
//
//  Computer.h
//  複合
//
//  Created by ma c on 16/5/11.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Keyboard.h"
#import "mouse.h"

@interface Computer : NSObject

@property (nonatomic, strong) Keyboard * keyboard;
@property (nonatomic, strong) mouse * mouse;

- (void) useKeyboard;

- (void) useMouse;

@end
//
//  Computer.m
//  複合
//
//  Created by ma c on 16/5/11.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "Computer.h"

@implementation Computer

- (void)useKeyboard {
    
    [self.keyboard test];
}

- (void)useMouse{
    
    [self.mouse test];
}
@end

//
//  Keyboard.m
//  複合
//
//  Created by ma c on 16/5/11.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "Keyboard.h"

@implementation Keyboard

- (void) test{
    NSLog(@"I am a keyboard");
}

@end

//
//  mouse.m
//  複合
//
//  Created by ma c on 16/5/11.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "mouse.h"

@implementation mouse

- (void)test{
    
    NSLog(@"I am a mouse");
}

@end

測試結果:
2016-05-11 18:31:28.434 複合[3189:1554979] I am a mouse
2016-05-11 18:31:28.435 複合[3189:1554979] I am a keyboard


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

-Advertisement-
Play Games
更多相關文章
  • iOS獲取通知需要註意以下三個地方iOS 設備收到一條推送(APNs),用戶點擊推送通知打開應用時,應用程式根據狀態不同進行處理需在 AppDelegate 中的以下兩個方法中添加代碼以獲取apn內容 如果 App 狀態為未運行,此函數將被調用,如果launchOptions包含UIApplicat ...
  • 資料庫:SQLite(輕量級,嵌入式的資料庫) 大量的相似結構的數據的儲存,快速的查詢。特殊的文件(按照一定的格式生成) 資料庫的創建 創建文件 1.聲明文件對象,文件是不會被創建出來的。 File file = new File("文件名稱"); 2.寫文件(文件才會被創建出來) FileOutp ...
  • 準備工作 Google VR SDK for Unity Github下載: https://github.com/googlevr/gvr-unity-sdk Google VR SDK文檔: https://developers.google.com/vr/unity/#features Goo ...
  • ### 背景 最近小區旁邊工地施工,今一大早就被工地傳來的guang!guang!...吵醒了。很響很響的那種,你們肯定會問具體有多響?具體要多響?怎麼描述呢?頓時就萌生出開發一款記錄聲音響度的app,忙活了一下午於是就出了這個聲音檢測儀 ### 簡介 android端的聲音檢測程式,實時獲取當前周... ...
  • android系統架構 1.Linux內核層(LINUX KERNEL) 這是系統架構的最低層,這層為android設備的硬體提供了驅動 2.系統運行庫層(LIBRARIES) 這一層為倒數第二層,利用一些c/c++庫來為android系統提供一些主要的特性支持,比如說SQLite庫提供了對資料庫的 ...
  • 最近把四大組件,網路編程,以及一些常用的控制項都學完了,不過感覺還不是特別牢固,所以決定再花一點時間重新過一遍,你們有這樣的感覺嗎? ...
  • 前言: 受颱風影響今天學校不上課,在家閑的蛋疼沒事做,使用Mac系統一段時間了發現它和Windows系統的操作風格還是有很大不同的,遂決定將Mac系統與Xcode的一些常用操作收集整理一下,方便自己日後查找使用。 一、Mac系統(OS X 10.10以上版本)操作篇 1)F11 開啟多個程式時可快速 ...
  • 程式執行需要讀取到安全敏感項必需在androidmanifest.xml中聲明相關許可權請求, 完整列表如下:android.permission.ACCESS_CHECKIN_PROPERTIES允許讀寫訪問”properties”表在 checkin資料庫中,改值可以修改上傳( Allows re ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...