最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析iOS應(yīng)用開發(fā)中對設(shè)計模式中的橋接模式的使用

 更新時間:2016年03月20日 21:30:29   作者:國土梅花  
這篇文章主要介紹了iOS應(yīng)用開發(fā)中對設(shè)計模式中的橋接模式的使用,bridge橋接模式中主張把抽象部分與實現(xiàn)部分分離,需要的朋友可以參考下

引言
  在項目開發(fā)中,我們會遇到這樣的一種場景:某些類型由于自身的邏輯,往往具有兩個或多個維度的變化,比如說大話設(shè)計模式書中所說的手機,它有兩個變化的維度:一是手機的品牌,可能有三星、蘋果等;二是手機上的軟件,可能有QQ、微信等。如何應(yīng)對這種“多維度的變化”?怎樣利用面向?qū)ο蟮募夹g(shù)來使得該類型能夠輕松的沿著多個方向進行變化,而又不引入額外的復(fù)雜度?這就是本章橋接模式所要解決的問題。


何為橋接模式?

    橋接模式的目的是把抽象層次結(jié)構(gòu)從其實現(xiàn)中分離出來,使其能夠獨立變更。抽象層定義了供客戶端使用的上層的抽象接口。實現(xiàn)層定義了供抽象層使用的底層接口。實現(xiàn)類的引用被封裝于抽象層的實例中,橋接就形成。(與外觀模式有一定的相似之處)。

    橋接模式:將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。

橋接模式的實例應(yīng)用

    比如有一家電視機制造商,他們生產(chǎn)的每臺電視都帶一個遙控器,用戶可以用遙控器進行頻道切換之類的操作。在這里遙控器是控制電視機的接口,如果每個電視機型號需要一個專用的遙控器,那么單是遙控器就會導(dǎo)致設(shè)計激增。不過,每個遙控器都有些功能是各種型號電視機共有的,比如切換頻道、調(diào)節(jié)音量和電源開關(guān)。而且每臺電視機都應(yīng)該能夠通過基本命令接口,響應(yīng)遙控器發(fā)來的這些命令。我們可以把遙控器邏輯同實際的電視機型號分離開來。這樣電視機型號的改變就不會對遙控器的設(shè)計有任何的影響。遙控器的同一個設(shè)計可以被復(fù)用和擴展,而不會影響其他電視機型號。如下圖所示:

2016320212809483.jpg (680×502)

     AbstractRemoteControl是定義了供客戶端使用的上層接口的父接口。它有一個對TVProtocol視力的引用,TVProtocol定義了實現(xiàn)類的接口。這個接口不必跟AbstractRemoteControl的接口一致,其實兩個接口可以完全不同。TVProtocol的接口提供基本的操作,而AbstractRemoteControl的上層操作基于這些基本操作。當客戶端向AbstractRemoteControl的實例發(fā)送operation消息時,這個方法向imp發(fā)送operationImp消息,底下的實際由TVA或TVB將作出響應(yīng)并接受任務(wù)。

    因此想要往系統(tǒng)中添加新的TVProtocol時,所要做的只是為TVProtocol創(chuàng)建一個新的實現(xiàn)類,響應(yīng)operationImp消息并在其中執(zhí)行任何具體的操作。不過,這對AbstractRemoteControl方面不會有任何影響。同樣,如果想修改AbstractRemoteControl的接口或者創(chuàng)建更細化的AbstractRemoteControl類,也不會影響橋接的另一頭。

    來看下具體的代碼實現(xiàn),先看下抽象部分的代碼實現(xiàn),AbstractRemoteControl代碼如下:

復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>
#import "TVProtocol.h"
@interface AbstractRemoteControl : NSObject
 
@property (nonatomic, weak) id<TVProtocol> tvProtocol;
 
- (void)detectTVFunction;
 
@end

復(fù)制代碼 代碼如下:

#import "AbstractRemoteControl.h"
 
@implementation AbstractRemoteControl
 
- (void)detectTVFunction {
    NSLog(@"檢測電視機具備的功能,由子類來進行實現(xiàn)");
}
 
@end

    在AbstractRemoteControl類中保持了對TVProtocol實例對象的引用,定義了供客戶端使用的上層抽象接口detectTVFunction,而這個方法的具體實現(xiàn)則由其子類去實現(xiàn),ConcreteRemoteControl代碼如下:
復(fù)制代碼 代碼如下:

#import "AbstractRemoteControl.h"
 
@interface ConcreteRemoteControl : AbstractRemoteControl
 
// 重寫該方法
- (void)detectTVFunction;
 
@end

復(fù)制代碼 代碼如下:

#import "ConcreteRemoteControl.h"
 
@implementation ConcreteRemoteControl
 
- (void)detectTVFunction {
    [self.tvProtocol switchChannel];
    [self.tvProtocol adjustVolume];
    [self.tvProtocol powerSwitch];
}
 
@end

    從這里我們可以看出,當客戶端向ConcreteRemoteControl的實例發(fā)送detectTVFunction消息時,這個方法向TVProtocol發(fā)送switchChannel、adjustVolume、powerSwitch三個消息,TVA或TVB將作出響應(yīng)并接受任務(wù)。至此,抽象部分代碼已經(jīng)完成了,接著看下實現(xiàn)部分的代碼,TVProtocol代碼如下:
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>
 
@protocol TVProtocol <NSObject>
 
@required
 
- (void)switchChannel; // 切換頻道
 
- (void)adjustVolume;  // 調(diào)節(jié)音量
 
- (void)powerSwitch;   // 電源開關(guān)
 
@end
    這就是一個協(xié)議,協(xié)議里面定義了三個方法,以后在創(chuàng)建電視機實例的時候,就必須遵守該協(xié)議,從而保證了電視機具有相同的功能。AbstractTV的代碼如下:

#import <Foundation/Foundation.h>
#import "TVProtocol.h"
@interface AbstractTV : NSObject <TVProtocol>
 
@end


復(fù)制代碼 代碼如下:

#import "AbstractTV.h"
 
@implementation AbstractTV
 
- (void)switchChannel {
    NSLog(@"切換頻道,由具體的子類來實現(xiàn)");
}
 
- (void)adjustVolume {
    NSLog(@"調(diào)節(jié)音量,由具體的子類來實現(xiàn)");
}
 
- (void)powerSwitch {
    NSLog(@"電源開關(guān),由具體的子類來實現(xiàn)");
}
 
@end

    TVA的代碼如下:
復(fù)制代碼 代碼如下:

#import "AbstractTV.h"
 
@interface TVA : AbstractTV
 
// 重寫這三個方法
- (void)switchChannel;
- (void)adjustVolume;
- (void)powerSwitch;
 
@end

復(fù)制代碼 代碼如下:

#import "TVA.h"
 
@implementation TVA
 
- (void)switchChannel {
    NSLog(@"電視機A 具備了切換頻道的功能");
}
 
- (void)adjustVolume {
    NSLog(@"電視機A 具備了調(diào)節(jié)音量的功能");
}
 
- (void)powerSwitch {
    NSLog(@"電視機A 具備了電源開關(guān)的功能");
}
 
@end

    TVB的代碼如下:
復(fù)制代碼 代碼如下:

#import "AbstractTV.h"
 
@interface TVB : AbstractTV
 
// 重寫這三個方法
- (void)switchChannel;
- (void)adjustVolume;
- (void)powerSwitch;
 
@end

復(fù)制代碼 代碼如下:

#import "TVB.h"
 
@implementation TVB
 
- (void)switchChannel {
    NSLog(@"電視機B 具備了切換頻道的功能");
}
 
- (void)adjustVolume {
    NSLog(@"電視機B 具備了調(diào)節(jié)音量的功能");
}
 
- (void)powerSwitch {
    NSLog(@"電視機B 具備了電源開關(guān)的功能");
}
 
@end

    到這里,橋接模式代碼已經(jīng)完成了,在客戶端該怎么去應(yīng)用呢?我們通過下面的客戶端代碼來說明,如下:
復(fù)制代碼 代碼如下:

#import "ViewController.h"
#import "AbstractRemoteControl.h"
#import "ConcreteRemoteControl.h"
#import "TVProtocol.h"
#import "AbstractTV.h"
#import "TVA.h"
#import "TVB.h"
 
typedef id<TVProtocol> TVProtocol; //在這里要進行一下轉(zhuǎn)換聲明,否則類中不能識別TVProtocol.
 
@interface ViewController ()
 
@end
 

 
復(fù)制代碼 代碼如下:

@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
 
    AbstractRemoteControl *remoteControl = [[ConcreteRemoteControl alloc] init];
    TVProtocol tvProtocol = [[TVA alloc] init];
    remoteControl.tvProtocol = tvProtocol;
    
    [remoteControl detectTVFunction];
    
    NSLog(@"http:///////////////////////////////");
    
    tvProtocol = [[TVB alloc] init];
    remoteControl.tvProtocol = tvProtocol;
    [remoteControl detectTVFunction];
    
    /**
     *  橋接模式:將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。
     *  在本例中,AbstractRemoteControl是抽象部分,TVProtocol是其實現(xiàn)部分。
     */
    
}
 
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
@end

    日志輸出如下:

2015-09-01 22:59:06.295 Bridge[16464:703747] 電視機A 具備了切換頻道的功能
2015-09-01 22:59:06.295 Bridge[16464:703747] 電視機A 具備了調(diào)節(jié)音量的功能
2015-09-01 22:59:06.296 Bridge[16464:703747] 電視機A 具備了電源開關(guān)的功能
2015-09-01 22:59:06.296 Bridge[16464:703747] ///////////////////////////////
2015-09-01 22:59:06.296 Bridge[16464:703747] 電視機B 具備了切換頻道的功能
2015-09-01 22:59:06.296 Bridge[16464:703747] 電視機B 具備了調(diào)節(jié)音量的功能
2015-09-01 22:59:06.296 Bridge[16464:703747] 電視機B 具備了電源開關(guān)的功能

    通過橋接模式的應(yīng)用,我們可以把抽象部分與實現(xiàn)部分分離,使它們都可以獨立的變化。比如在本例中,對AbstractRemoteControl的修改,不會影響到TVProtocol。同樣對TVProtocol的修改,也不會影響AbstractRemoteControl。這正是橋接模式帶給我們的便利性。
   
小結(jié)

總的來說,橋接模式的本質(zhì)在于“分離抽象和實現(xiàn)”。

橋接模式的優(yōu)點:

橋接模式使用聚合關(guān)系,解耦了抽象和實現(xiàn)之間固有的綁定關(guān)系,使得抽象和實現(xiàn)可以沿著各自的維度來變化。
提高了系統(tǒng)的可擴展性,可以獨立地對抽象部分和實現(xiàn)部分進行擴展。
可減少子類的個數(shù),這個在前面講手機示例的時候進行分析了。

橋接模式的缺點:
橋接模式的引入會增加系統(tǒng)的理解與設(shè)計難度,由于聚合關(guān)系建立在抽象層,要求開發(fā)者針對抽象進行設(shè)計與編程。
橋接模式要求正確識別出系統(tǒng)中兩個獨立變化的維度,因此其使用范圍具有一定的局限性。

適用場景
通過優(yōu)缺點的分析,我們可以在如下的情形下使用橋接模式:
不想在抽象與其實現(xiàn)之間形成固定的綁定關(guān)系;
抽象及其實現(xiàn)都應(yīng)可以通過子類化獨立進行擴展;
對抽象的實現(xiàn)進行修改不應(yīng)影響客戶端代碼;
如果每個實現(xiàn)需要額外的子類以細化抽象,則說明有必要把它們分成兩個部分;
想在帶有不同抽象接口的多個對象之間共享一個實現(xiàn)。

相關(guān)文章

  • iOS 通用鏈接(Universal Link)配置詳解

    iOS 通用鏈接(Universal Link)配置詳解

    這篇文章主要介紹了iOS 通用鏈接(Universal Link)配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Swift項目集成QQ授權(quán)登錄

    Swift項目集成QQ授權(quán)登錄

    這篇文章主要介紹了Swift項目集成QQ授權(quán)登錄的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • iOS使用CoreMotion實現(xiàn)搖一搖功能

    iOS使用CoreMotion實現(xiàn)搖一搖功能

    這篇文章主要為大家詳細介紹了iOS使用CoreMotion實現(xiàn)搖一搖功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • iOS實現(xiàn)簡易的導(dǎo)航欄顏色漸變實例代碼

    iOS實現(xiàn)簡易的導(dǎo)航欄顏色漸變實例代碼

    很多APP 都有導(dǎo)航欄顏色漸變的效果,下面這篇文章主要給大家介紹了關(guān)于iOS如何實現(xiàn)簡易的導(dǎo)航欄顏色漸變效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-10-10
  • IOS UITableView顏色設(shè)置的實例詳解

    IOS UITableView顏色設(shè)置的實例詳解

    這篇文章主要介紹了IOS UITableView顏色設(shè)置的實例詳解的相關(guān)資料,這里提供了幾種方法幫助大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • 詳解iOS中Button按鈕的狀態(tài)和點擊事件

    詳解iOS中Button按鈕的狀態(tài)和點擊事件

    這篇文章先是給大家介紹iOS中Button按鈕的狀態(tài),而后又詳細介紹了iOS中按鈕點擊事件處理方式,本文介紹的很詳細,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-09-09
  • iOS中的UISlider滑塊組件用法總結(jié)

    iOS中的UISlider滑塊組件用法總結(jié)

    不僅是滑動開關(guān),UISlider組件也是常用的進度條制作工具,這里我們就一起來看一下iOS中的UISlider滑塊組件用法總結(jié),需要的朋友可以參考下
    2016-06-06
  • iOS中滑動控制屏幕亮度和系統(tǒng)音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統(tǒng)音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統(tǒng)音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • iOS字體大小適配的3種方法示例代碼

    iOS字體大小適配的3種方法示例代碼

    這篇文章主要給大家介紹了關(guān)于iOS字體大小適配的3種方法,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • UITableViewCell在編輯狀態(tài)下背景顏色的修改方法

    UITableViewCell在編輯狀態(tài)下背景顏色的修改方法

    這篇文章主要給大家介紹了關(guān)于UITableViewCell在編輯狀態(tài)下背景顏色的修改方法,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07

最新評論

新宁县| 深圳市| 读书| 孝昌县| 武定县| 平凉市| 湖口县| 宁陵县| 东山县| 昔阳县| 和林格尔县| 奈曼旗| 乌鲁木齐县| 鄂尔多斯市| 镇江市| 疏勒县| 从化市| 多伦县| 绿春县| 即墨市| 澳门| 融水| 松潘县| 牡丹江市| 新闻| 武陟县| 维西| 峡江县| 若羌县| 东丰县| 平谷区| 会理县| 迁西县| 万载县| 石屏县| 新源县| 多伦县| 鹿邑县| 乐昌市| 越西县| 敦煌市|