定義
外觀模式(Facade)条舔,為子系統(tǒng)中的一組接口提供一個一致的界面枫耳,定義一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用孟抗。
適用場景
在以下情況下可以考慮使用外觀模式:
為復雜的模塊或子系統(tǒng)提供外界訪問的模塊迁杨;
子系統(tǒng)相互獨立;
在層析結(jié)構(gòu)中凄硼,可以使用外觀模式定義系統(tǒng)的每一層的入口铅协。
優(yōu)點
** 松散耦合**
使得客戶端和子系統(tǒng)之間解耦,讓子系統(tǒng)內(nèi)部的模塊功能更容易擴展和維護摊沉;
簡單易用
客戶端根本不需要知道子系統(tǒng)內(nèi)部的實現(xiàn)狐史,或者根本不需要知道子系統(tǒng)內(nèi)部的構(gòu)成,它只需要跟Facade類交互即可说墨。
更好的劃分訪問層次
有些方法是對系統(tǒng)外的骏全,有些方法是系統(tǒng)內(nèi)部相互交互的使用的。子系統(tǒng)把那些暴露給外部的功能集中到門面中尼斧,這樣就可以實現(xiàn)客戶端的使用姜贡,很好的隱藏了子系統(tǒng)內(nèi)部的細節(jié)。
角色
門面角色:外觀模式的核心棺棵。它被客戶角色調(diào)用鲁豪,它熟悉子系統(tǒng)的功能潘悼。內(nèi)部根據(jù)客戶角色的需求預定了幾種功能的組合。
子系統(tǒng)角色:實現(xiàn)了子系統(tǒng)的功能爬橡。它對客戶角色和Facade時未知的。它內(nèi)部可以有系統(tǒng)內(nèi)的相互交互棒动,也可以由供外界調(diào)用的接口糙申。
客戶角色:通過調(diào)用Facede來完成要實現(xiàn)的功能。
場景模擬
去醫(yī)院看病船惨,可能要去掛號柜裸、門診、劃價粱锐、取藥疙挺,讓患者或患者家屬覺得很復雜,如果有提供接待人員怜浅,只讓接待人員來處理铐然,就很方便。
外觀模式UML圖
簡單代碼
#import <Foundation/Foundation.h>
@interface Receptionist : NSObject
-(void)seeDoctor;
@end
#import "Receptionist.h"
#import "Register.h"
#import "Medicine.h"
@implementation Receptionist
-(void)seeDoctor{
[[Register new]reginster];
[[Medicine new]medicine];
}
@end
#import <Foundation/Foundation.h>
@interface Medicine : NSObject
-(void)medicine;
@end
#import "Medicine.h"
@implementation Medicine
-(void)medicine{
NSLog(@"病人取藥");
}
@end
#import "Register.h"
@implementation Register
-(void)reginster{
NSLog(@"病人注冊");
}
@end
#import <Foundation/Foundation.h>
@interface Register : NSObject
-(void)reginster;
@end
#import <Foundation/Foundation.h>
#import "Receptionist.h"
@interface Patient : NSObject
@property (nonatomic,strong) Receptionist *receptionist;
@end
#import "Patient.h"
@implementation Patient
@end
測試代碼
Receptionist * receptionist= [Receptionist new];
Patient * patients= [[Patient alloc]init];
patients.receptionist =receptionist;
[patients.receptionist seeDoctor];
測試結(jié)果
2018-04-09 12:46:37.516153+0800 結(jié)構(gòu)型設計模式-外觀模式[37443:7517248] 病人注冊
2018-04-09 12:46:37.516303+0800 結(jié)構(gòu)型設計模式-外觀模式[37443:7517248] 病人取藥
上面的receptionist 可以現(xiàn)實一個協(xié)議恶座,實現(xiàn)一個子類實現(xiàn)該協(xié)議擴展更好
其實外觀模式相對來說比較簡單搀暑,在ios中,我們經(jīng)常引用第三方框架跨琳,我們其實這里就可以做成外觀模式自点,要是以后替換第三方框架省心不少。(很簡單脉让,網(wǎng)絡請求框架asi 換成 AFNetworking桂敛,要是以前沒有這個中間代理人,那么要全工程都要改一遍溅潜,要是有這個中間者术唬,只在這個中間者中修改就可以了)
下一篇博客
[結(jié)構(gòu)型設計模式-享元模式](http://www.reibang.com/p/218edf152029)