簡(jiǎn)介:作為一名開發(fā)人員掌握設(shè)計(jì)模式是一項(xiàng)基本的技能痒芝。設(shè)計(jì)模式是在軟件設(shè)計(jì)上去解決普通問題的可重用的方法.他們是是幫助你讓所寫的代碼更加容易理解和提高可重用性的模板.它們還可以幫你創(chuàng)建松散耦合的代碼是你能不費(fèi)很大功夫就可以改變或者替代你的代碼中的一部分。
本文部分內(nèi)容參考:
文章
1:外觀設(shè)計(jì)模式
1.外觀設(shè)計(jì)模式概念描述:為系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的接口。外觀定義一個(gè)高層的接口,讓子系統(tǒng)更易于使用。
2:角色
(1)子系統(tǒng)類:每個(gè)子系統(tǒng)定義了相關(guān)功能和模塊的接口蝇棉。
(2)Facade(外觀類):整合子系統(tǒng)中的接口喜最,客戶端可以調(diào)用這個(gè)類的方法俐末。
(3)Clients(客戶端):通過外觀類提供的接口和各個(gè)子系統(tǒng)的接口進(jìn)行交互料按。
3.結(jié)構(gòu)圖
4:使用場(chǎng)景
(1)設(shè)計(jì)初期階段,應(yīng)該有意識(shí)的將不同層分離卓箫,層與層之間建立外觀模式载矿。
(2)開發(fā)階段,子系統(tǒng)越來越復(fù)雜烹卒,增加外觀模式提供一個(gè)簡(jiǎn)單的調(diào)用接口闷盔。
(3)維護(hù)一個(gè)大型遺留系統(tǒng)的時(shí)候,可能這個(gè)系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展旅急,但又包含非常重要的功能逢勾,為其開發(fā)一個(gè)外觀類,以便新系統(tǒng)與其交互坠非。
場(chǎng)景舉例:現(xiàn)在買車子比較火熱敏沉,就以買車子舉例子吧!來到售車部我們選好了車子炎码,現(xiàn)在進(jìn)入到買車子的具體流程中。你從售車部買一輛車子秋泳,幾乎要涉及到店里的每個(gè)部門潦闲,比如財(cái)務(wù)部門、銷售部門迫皱、售后服務(wù)部門等等歉闰。
我們買一輛房子其實(shí)不需要跑遍每一個(gè)部門,我們只需要跟接待啊自己的銷售服務(wù)人員溝通好就可以了卓起,我們只要選擇好車子和敬,交錢(比如貸款,現(xiàn)金)戏阅,其他的流程具體的服務(wù)人員會(huì)幫你完成昼弟。在這個(gè)例子中售車部的銷售人員就是一個(gè)外觀服務(wù)角色,其他的各個(gè)部門其實(shí)就類似一個(gè)個(gè)的子系統(tǒng)奕筐,為我們進(jìn)行不同的服務(wù)舱痘,下面我們看一下具體的代碼實(shí)現(xiàn)。
1.財(cái)務(wù)部門:FinanceDepartment:財(cái)務(wù)部門管理:現(xiàn)金付款离赫、申請(qǐng)貸款芭逝、審核貸款、放款等業(yè)務(wù)渊胸。
@interface FinanceDepartment : NSObject
// 現(xiàn)金支付
- (void)cashPayment;
// 申請(qǐng)貸款
- (BOOL)applyLoan;
// 審核貸款
- (BOOL)auditLoan;
// 放款
- (BOOL)getLoad;
@end
2.銷售部門管理SalesDepartment:車輛調(diào)配旬盯、配件、贈(zèng)品等業(yè)務(wù)。
@interface SalesDepartment : NSObject
// 提車
- (void)provideHouse;
// 車貼膜
- (void)carFilm;
// 行車記錄儀
- (void)tachograph;
// 發(fā)動(dòng)機(jī)護(hù)板
- (void)engineGuard;
// 腳墊
- (void)mat;
@end
3.售后服務(wù)部門AfterSales
@interface AfterSales : NSObject
// 洗車服務(wù)
- (void)carWash;
// 上牌服務(wù)
- (void)applyPlate;
// 貼膜服務(wù)
- (void)filming;
// 安裝行車記錄儀
- (void)installTachograph;
@end
上面是我們的子系統(tǒng)接口胖翰,對(duì)于客戶來說沒必要關(guān)心這么多業(yè)務(wù)频丘,所以我們定義一個(gè)高層接口類來統(tǒng)一各個(gè)子系統(tǒng)的接口,這個(gè)類就是我們的4S銷售接待人員的角色類:SalesServicesPeople泡态。這是和客戶端直接打交道的類搂漠。
@interface SalesServicesPeople : NSObject
- (void)buyCarWithCash;// 現(xiàn)金買車
- (void)buyCarWithLoad;// 貸款買車
@end
#import "SalesServicesPeople.h"
#import "AfterSales.h"
#import "FinanceDepartment.h"
#import "SalesDepartment.h"
@interface SalesServicesPeople(){
FinanceDepartment *finance;// 財(cái)務(wù)部門
SalesDepartment *sales;// 銷售部門
AfterSales *service;// 售后服務(wù)部門
}
@end
@implementation SalesServicesPeople
- (instancetype)init{
self = [super init];
if (self) {
finance = [[FinanceDepartment alloc] init];
sales = [[SalesDepartment alloc] init];
service = [[AfterSales alloc] init];
}
return self;
}
// 現(xiàn)金買車
- (void)buyCarWithCash{
// 現(xiàn)金支付
[finance cashPayment];
// 贈(zèng)送禮品
[self gift];
// 提供服務(wù)
[self service];
}
// 贈(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];
}
// 貸款買車
- (void)buyCarWithLoad{
if ([finance applyLoan]) {
// 贈(zèng)送禮品
[self gift];
// 提供服務(wù)
[self service];
}else{
NSLog(@"貸款失敗");
}
}
最后直接在控制器調(diào)用就可以了
#import "SalesViewController.h"
#import "SalesServicesPeople.h"
@interface SalesViewController ()
@property(nonatomic,readwrite,strong)SalesServicesPeople *salesPeople;
@end
@implementation SalesViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.navigationItem.title = @"外觀設(shè)計(jì)模式";
self.salesPeople = [[SalesServicesPeople alloc] init];
[self.salesPeople buyCarWithCash];
}
輸出結(jié)果
2017-08-22 11:32:49.693 DesignPatterns[44298:13510747] 現(xiàn)金支付
2017-08-22 11:32:49.693 DesignPatterns[44298:13510747] 贈(zèng)品有:
2017-08-22 11:32:49.695 DesignPatterns[44298:13510747] 車貼膜
2017-08-22 11:32:49.695 DesignPatterns[44298:13510747] 行車記錄儀
2017-08-22 11:32:49.695 DesignPatterns[44298:13510747] 發(fā)動(dòng)機(jī)護(hù)板
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 腳墊
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 售后服務(wù):
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 洗車服務(wù)
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 上牌服務(wù)
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 貼膜服務(wù)
2017-08-22 11:32:49.697 DesignPatterns[44298:13510747] 安裝行車記錄儀