設(shè)計(jì)模式系列文章
《iOS設(shè)計(jì)模式(1)簡(jiǎn)單工廠模式》
《iOS設(shè)計(jì)模式(2)工廠模式》
《iOS設(shè)計(jì)模式(3)適配器模式》
《iOS設(shè)計(jì)模式(4)抽象工廠模式》
《iOS設(shè)計(jì)模式(5)策略模式》
《iOS設(shè)計(jì)模式(6)模板模式》
《iOS設(shè)計(jì)模式(7)建造者模式》
最近事情比較多友瘤,很長(zhǎng)時(shí)間沒(méi)有更新文章了贴妻。正好今天有時(shí)間瘪松,我們看一下設(shè)計(jì)模式之外觀模式历极。
1概念描述
“為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的接口。外觀模式定義了一個(gè)更高層次的接口秧了,這個(gè)接口使得這一子系統(tǒng)更加容易使用〗垂蹋” ----《設(shè)計(jì)模式》(Addison-Wesley,1994)
【注意:子系統(tǒng)可以是多個(gè)也可以是一個(gè)⊥分欤】
2.角色
(1)子系統(tǒng)類(lèi):每個(gè)子系統(tǒng)定義了相關(guān)功能和模塊的接口运悲。
(2)Facade(外觀類(lèi)):整合子系統(tǒng)中的接口,客戶(hù)端可以調(diào)用這個(gè)類(lèi)的方法髓窜。
(3)Clients(客戶(hù)端):通過(guò)外觀類(lèi)提供的接口和各個(gè)子系統(tǒng)的接口進(jìn)行交互扇苞。
參考結(jié)構(gòu)圖(來(lái)自百度百科)
3.適用場(chǎng)景
在以下情況下可以考慮使用外觀模式:
(1)設(shè)計(jì)初期階段,應(yīng)該有意識(shí)的將不同層分離寄纵,層與層之間建立外觀模式鳖敷。
(2)開(kāi)發(fā)階段,子系統(tǒng)越來(lái)越復(fù)雜程拭,增加外觀模式提供一個(gè)簡(jiǎn)單的調(diào)用接口定踱。
(3)維護(hù)一個(gè)大型遺留系統(tǒng)的時(shí)候,可能這個(gè)系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展恃鞋,但又包含非常重要的功能崖媚,為其開(kāi)發(fā)一個(gè)外觀類(lèi),以便新系統(tǒng)與其交互恤浪。百度百科
我們看一下具體的使用場(chǎng)景吧畅哑,還記得前面文章中我們提到買(mǎi)車(chē)的事吧,今天還是拿買(mǎi)車(chē)說(shuō)事水由。前面我們選好了車(chē)荠呐,現(xiàn)在進(jìn)入到買(mǎi)車(chē)的具體流程中。你從4S店買(mǎi)一輛車(chē)砂客,幾乎要涉及到店里的每個(gè)部門(mén)泥张,比如財(cái)務(wù)部門(mén)、銷(xiāo)售部門(mén)鞠值、售后服務(wù)部門(mén)等等媚创。
那么問(wèn)題來(lái)了,我們買(mǎi)一輛車(chē)真的就需要把4S店的每個(gè)部門(mén)都跑一邊嗎彤恶?其實(shí)沒(méi)必要钞钙,我們只要跟接待自己的銷(xiāo)售服務(wù)人員溝通好就行了,剩下的事情声离,她可以幫我們做歇竟。比如說(shuō):我們只要選好付款方式,然后去交錢(qián)就完事了抵恋,并不關(guān)心財(cái)務(wù)部門(mén)內(nèi)部那些全款買(mǎi)車(chē)的流程和貸款買(mǎi)車(chē)的流程;也不用關(guān)心怎樣去銷(xiāo)售部門(mén)拿贈(zèng)品宝磨;也不用關(guān)心售后服務(wù)部門(mén)誰(shuí)來(lái)幫你做那些服務(wù)內(nèi)容弧关;這一切我們只要跟接待自己的銷(xiāo)售人員溝通就好了盅安。
這個(gè)例子中4S店的各個(gè)部門(mén)其實(shí)就類(lèi)似一個(gè)個(gè)的子系統(tǒng),而接待我們的美女銷(xiāo)售就是外觀角色世囊。下面我們看一下具體的代碼實(shí)現(xiàn)别瞭。
4.代碼實(shí)現(xiàn)
先看各個(gè)子系統(tǒng)的接口實(shí)現(xiàn)吧:
(1)LHFinance:財(cái)務(wù)部門(mén)管理:現(xiàn)金付款、申請(qǐng)貸款株憾、審核貸款蝙寨、放款等業(yè)務(wù)。
#import <Foundation/Foundation.h>
@interface LHFinance : NSObject
// 現(xiàn)金支付
- (void)cashPayment;
// 申請(qǐng)貸款
- (BOOL)applyLoan;
// 審核貸款
- (BOOL)auditLoan;
// 放款
- (BOOL)getLoad;
@end
(2)銷(xiāo)售部門(mén)管理:車(chē)輛調(diào)配嗤瞎、配件墙歪、贈(zèng)品等業(yè)務(wù)。
#import <Foundation/Foundation.h>
@interface LHSales : NSObject
// 提車(chē)
- (void)provideCar;
// 車(chē)貼膜
- (void)carFilm;
// 行車(chē)記錄儀
- (void)tachograph;
// 發(fā)動(dòng)機(jī)護(hù)板
- (void)engineGuard;
// 腳墊
- (void)mat;
@end
(3)售后服務(wù)部門(mén)管理:售前服務(wù)(貼膜贝奇、裝配件虹菲、洗車(chē)、上牌等服務(wù))和售后服務(wù)(維修掉瞳、保養(yǎng)等)
#import <Foundation/Foundation.h>
@interface LHService : NSObject
// 洗車(chē)服務(wù)
- (void)carWash;
// 上牌服務(wù)
- (void)applyPlate;
// 貼膜服務(wù)
- (void)filming;
// 安裝行車(chē)記錄儀
- (void)installTachograph;
@end
上面是我們的子系統(tǒng)接口毕源,對(duì)于客戶(hù)來(lái)說(shuō)沒(méi)必要關(guān)心這么多業(yè)務(wù),所以我們定義一個(gè)高層接口類(lèi)來(lái)統(tǒng)一各個(gè)子系統(tǒng)的接口陕习,這個(gè)類(lèi)就是我們的4S銷(xiāo)售接待人員的角色類(lèi):LHService霎褐。
#import <Foundation/Foundation.h>
@interface LH4SWaiter : NSObject
- (void)buyCarWithCash;// 現(xiàn)金買(mǎi)車(chē)
- (void)buyCarWithLoad;// 貸款買(mǎi)車(chē)
@end
#import "LH4SWaiter.h"
#import "LHFinance.h"
#import "LHSales.h"
#import "LHService.h"
@interface LH4SWaiter ()
{
LHFinance *finance;// 財(cái)務(wù)部門(mén)
LHSales *sales;// 銷(xiāo)售部門(mén)
LHService *service;// 售后服務(wù)部門(mén)
}
@end
@implementation LH4SWaiter
- (instancetype)init
{
self = [super init];
if (self) {
finance = [[LHFinance alloc] init];
sales = [[LHSales alloc] init];
service = [[LHService alloc] init];
}
return self;
}
// 現(xiàn)金買(mǎi)車(chē)
- (void)buyCarWithCash{
// 現(xiàn)金支付
[finance cashPayment];
// 贈(zèng)送禮品
[self gift];
// 提供服務(wù)
[self service];
}
// 貸款買(mǎi)車(chē)
- (void)buyCarWithLoad{
BOOL _isSuccess = [finance applyLoan];
// 如果貸款審批下來(lái),則提車(chē)该镣、送贈(zèng)品和服務(wù)
if (_isSuccess) {
[sales provideCar];
[self gift];
[self service];
}else{
NSLog(@"貸款審批未通過(guò)冻璃!");
}
}
// 贈(zèng)品
- (void)gift{
NSLog(@"贈(zèng)品有:");
[sales carFilm];
[sales tachograph];
[sales engineGuard];
[sales mat];
}
// 服務(wù)
- (void)service{
NSLog(@"售后服務(wù):");
[service carWash];
[service applyPlate];
[service filming];
[service installTachograph];
}
@end
這樣客戶(hù)只要告訴她我是現(xiàn)金支付還是貸款支付,剩余的事情她全部幫你做了拌牲,比如貸款的話俱饿,貸款的申請(qǐng)、審核塌忽、放款等拍埠。再比如哪些贈(zèng)品,哪些服務(wù)她都幫你安排好土居。
客戶(hù)端只要簡(jiǎn)單調(diào)用就可以了:
#import "ViewController.h"
#import "LH4SWaiter.h"
@interface ViewController ()
{
LH4SWaiter *_waiter;
}
@end
@implementation ViewController
#pragma mark -
#pragma mark System Method
- (void)viewDidLoad {
[super viewDidLoad];
_waiter = [[LH4SWaiter alloc] init];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
#pragma mark -
#pragma mark Button Event
// 現(xiàn)金買(mǎi)車(chē)
- (IBAction)btnCashEvent:(UIButton *)sender {
[_waiter buyCarWithCash];
}
// 貸款買(mǎi)車(chē)
- (IBAction)btnLoanEvent:(UIButton *)sender {
[_waiter buyCarWithLoad];
}
@end
下面是輸出結(jié)果:
5.優(yōu)點(diǎn)
1.使用外觀模式可以使項(xiàng)目更好的分層亏镰,增強(qiáng)了代碼的擴(kuò)展性。
2.客戶(hù)端屏蔽了子系統(tǒng)組件允睹,使客戶(hù)端和子系統(tǒng)之間實(shí)現(xiàn)了松耦合關(guān)系榕酒。