為子系統中的一組介面提供了一個一致的界面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用 這要分三個階段來說,首先,在設計初期階段,應該要有意識的將不同的兩個層分離,比如經典的三層架構,就需要考慮在數據訪問層和業務邏輯層,業務邏輯層和表示層的層與層之間建立外觀Facada,這樣可以為復
什麼是外觀模式
為子系統中的一組介面提供了一個一致的界面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用
何時使用外觀模式
這要分三個階段來說,首先,在設計初期階段,應該要有意識的將不同的兩個層分離,比如經典的三層架構,就需要考慮在數據訪問層和業務邏輯層,業務邏輯層和表示層的層與層之間建立外觀Facada,這樣可以為複雜的子系統提供一個簡單的jiek,使得耦合大大降低,其次,在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜,大多數的模式使用時也都會產生很多很小的類,這本就是好事,但是也給外部調用他們的用戶程式帶來了使用上的困難,增加外觀Facade 可以提供一個簡單的介面,減少他們之間的依賴,第三,在維護一個一流的大型系統時,可能這個系統已經非常難以維護和擴展了,但是因為它包含非常重要的功能,新的需求開發必須要依賴於它,此時用外觀模式Facade也是非常合適的,你可以為新系統開發一個外觀Facade對象交互,Facade與一流代碼交互所有的複雜的工作
OC代碼實現
SubsystemOne.h
#import <Foundation/Foundation.h>@interface SubsystemOne : NSObject
-(void)MethodOne; @end
SubsystemOne.m
#import "SubsystemOne.h" @implementation SubsystemOne -(void)MethodOne{ NSLog(@"方法一"); } @end
其他的三個子類類似
外觀類Facade.h
#import <Foundation/Foundation.h> #import "SubsystemOne.h" #import "SubSystemTwo.h" #import "SubSystemThree.h" @interface Facade : NSObject @property(nonatomic,strong)SubsystemOne *one; @property(nonatomic,strong)SubSystemTwo *two; @property(nonatomic,strong)SubSystemThree *three; -(void)MethodA; -(void)MethodB; @end
外觀類Facade.m
#import "Facade.h" @implementation Facade - (instancetype)init { self = [super init]; if (self) { _one=[[SubsystemOne alloc]init]; _two=[[SubSystemTwo alloc]init]; _three=[[SubSystemThree alloc]init]; } return self; } -(void)MethodA{ NSLog(@"方法A"); [_one MethodOne]; [_two MethodTwo]; [_three MethodThree]; } -(void)MethodB{ NSLog(@"方法B"); [_one MethodOne]; [_three MethodThree]; } @end
客戶端
#import <Foundation/Foundation.h> #import "Facade.h" int main(int argc, const char * argv[]) { @autoreleasepool { Facade *facade=[[Facade alloc]init]; [facade MethodA]; [facade MethodB]; } return 0; }
運行結果
總結
適用場景
在以下情況下可以考慮使用外觀模式: (1)設計初期階段,應該有意識的將不同層分離,層與層之間建立外觀模式。 (2) 開發階段,子系統越來越複雜,增加外觀模式提供一個簡單的調用介面。 (3) 維護一個大型遺留系統的時候,可能這個系統已經非常難以維護和擴展,但又包含非常重要的功能,為其開發一個外觀類,以便新系統與其交互。
優點
(1)實現了子系統與客戶端之間的松耦合關係。 (2)客戶端屏蔽了子系統組件,減少了客戶端所需處理的對象數目,並使得子系統使用起來更加容易。