简介:作为一名开发人员掌握设计模式是一项基本的技能。设计模式是在软件设计上去解决普通问题的可重用的方法.他们是是帮助你让所写的代码更加容易理解和提高可重用性的模板.它们还可以帮你创建松散耦合的代码是你能不费很大功夫就可以改变或者替代你的代码中的一部分。
本文部分内容参考:
文章
1:外观设计模式
1.外观设计模式概念描述:为系统中的一组接口提供一个统一的接口。外观定义一个高层的接口,让子系统更易于使用。
2:角色
(1)子系统类:每个子系统定义了相关功能和模块的接口。
(2)Facade(外观类):整合子系统中的接口,客户端可以调用这个类的方法。
(3)Clients(客户端):通过外观类提供的接口和各个子系统的接口进行交互。
3.结构图
4:使用场景
(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
(2)开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
(3)维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
场景举例:现在买车子比较火热,就以买车子举例子吧!来到售车部我们选好了车子,现在进入到买车子的具体流程中。你从售车部买一辆车子,几乎要涉及到店里的每个部门,比如财务部门、销售部门、售后服务部门等等。
我们买一辆房子其实不需要跑遍每一个部门,我们只需要跟接待啊自己的销售服务人员沟通好就可以了,我们只要选择好车子,交钱(比如贷款,现金),其他的流程具体的服务人员会帮你完成。在这个例子中售车部的销售人员就是一个外观服务角色,其他的各个部门其实就类似一个个的子系统,为我们进行不同的服务,下面我们看一下具体的代码实现。
1.财务部门:FinanceDepartment:财务部门管理:现金付款、申请贷款、审核贷款、放款等业务。
@interface FinanceDepartment : NSObject
// 现金支付
- (void)cashPayment;
// 申请贷款
- (BOOL)applyLoan;
// 审核贷款
- (BOOL)auditLoan;
// 放款
- (BOOL)getLoad;
@end
2.销售部门管理SalesDepartment:车辆调配、配件、赠品等业务。
@interface SalesDepartment : NSObject
// 提车
- (void)provideHouse;
// 车贴膜
- (void)carFilm;
// 行车记录仪
- (void)tachograph;
// 发动机护板
- (void)engineGuard;
// 脚垫
- (void)mat;
@end
3.售后服务部门AfterSales
@interface AfterSales : NSObject
// 洗车服务
- (void)carWash;
// 上牌服务
- (void)applyPlate;
// 贴膜服务
- (void)filming;
// 安装行车记录仪
- (void)installTachograph;
@end
上面是我们的子系统接口,对于客户来说没必要关心这么多业务,所以我们定义一个高层接口类来统一各个子系统的接口,这个类就是我们的4S销售接待人员的角色类:SalesServicesPeople。这是和客户端直接打交道的类。
@interface SalesServicesPeople : NSObject
- (void)buyCarWithCash;// 现金买车
- (void)buyCarWithLoad;// 贷款买车
@end
#import "SalesServicesPeople.h"
#import "AfterSales.h"
#import "FinanceDepartment.h"
#import "SalesDepartment.h"
@interface SalesServicesPeople(){
FinanceDepartment *finance;// 财务部门
SalesDepartment *sales;// 销售部门
AfterSales *service;// 售后服务部门
}
@end
@implementation SalesServicesPeople
- (instancetype)init{
self = [super init];
if (self) {
finance = [[FinanceDepartment alloc] init];
sales = [[SalesDepartment alloc] init];
service = [[AfterSales alloc] init];
}
return self;
}
// 现金买车
- (void)buyCarWithCash{
// 现金支付
[finance cashPayment];
// 赠送礼品
[self gift];
// 提供服务
[self service];
}
// 赠品
- (void)gift{
NSLog(@"赠品有:");
[sales carFilm];
[sales tachograph];
[sales engineGuard];
[sales mat];
}
// 服务
- (void)service{
NSLog(@"售后服务:");
[service carWash];
[service applyPlate];
[service filming];
[service installTachograph];
}
// 贷款买车
- (void)buyCarWithLoad{
if ([finance applyLoan]) {
// 赠送礼品
[self gift];
// 提供服务
[self service];
}else{
NSLog(@"贷款失败");
}
}
最后直接在控制器调用就可以了
#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 = @"外观设计模式";
self.salesPeople = [[SalesServicesPeople alloc] init];
[self.salesPeople buyCarWithCash];
}
输出结果
2017-08-22 11:32:49.693 DesignPatterns[44298:13510747] 现金支付
2017-08-22 11:32:49.693 DesignPatterns[44298:13510747] 赠品有:
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] 发动机护板
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 脚垫
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 售后服务:
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 洗车服务
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 上牌服务
2017-08-22 11:32:49.696 DesignPatterns[44298:13510747] 贴膜服务
2017-08-22 11:32:49.697 DesignPatterns[44298:13510747] 安装行车记录仪