外观模式的解析-iOS
其他设计模式的介绍
1、简单工厂模式、工厂模式、抽象工厂模式的解析-iOS
2、建造者模式的解析-iOS
3、单例模式的解析-iOS
4、原型模式的解析-iOS
5、代理模式的解析-iOS
6、适配器模式的解析-iOS
7、装饰器模式的解析-iOS
8、外观模式的解析-iOS
9、桥接模式的解析-iOS
10、组合模式的解析-iOS
概率描述
“为子系统中的一组接口提供一个统一的接口。外观模式定义了一个更高层次的接口,这个接口使得这一子系统更加容易使用。” —-《设计模式》(Addison-Wesley,1994)
角色
1、子系统:底层的子系统,定义了自己的相关的功能和接口
2、外观类:整合底部子系统的接口供给外部调用者调用
3、外部调用者:调用外观类的接口或者子系统的接口,和底层子系统进行通信
实用场景
(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
(2)开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
(3)维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。百度百科
案例解析
我记得之前在讲代理模式的解析的时候有讲过买房子的事情,有讲过买房子的事情,今天我又以这个话题来讲一下外观模式。
就是我们去买房的时候不可能每个环节都去跑,比如建造房子和联系贷款人员办理贷款,和查征信这些东西。我们只需要一切的沟通和房产销售沟通就行了。房产中介去安排贷款,去督促承建者去建设房子。
角色分类:
子系统:房子承建者,办理贷款的银行人员
外观类:房产销售
外部调用者:买房子的人
房子的承建者的代码
//.h文件
#import <Foundation/Foundation.h>
@interface BuildPerson : NSObject
/*
*建设房子
*/
-(void)buildHouse;
@end
//.m文件
#import "BuildPerson.h"
@implementation BuildPerson
/*
*建设房子
*/
-(void)buildHouse{
NSLog(@"建设房子");
}
@end
银行的贷款人员的代码
//.h文件
#import <Foundation/Foundation.h>
@interface BankPerson : NSObject
/*
*面签
*/
-(void)visaInterview;
/*
*检查征信
*/
-(BOOL)checkCredit;
/*
*检查银行流水
*/
-(BOOL)checkAccountStatement;
/*
*放款
*/
-(BOOL)transactionLoans;
/*
*检查购房资格
*/
-(BOOL)checkHousePurchaseQualification;
@end
//.m文件
#import "BankPerson.h"
@implementation BankPerson
/*
*面签
*/
-(void)visaInterview{
NSLog(@"面签");
}
/*
*检查购房资格
*/
-(BOOL)checkHousePurchaseQualification{
NSLog(@"检查购房资格");
return YES;
}
/*
*检查征信
*/
-(BOOL)checkCredit{
NSLog(@"检查征信");
return YES;
}
/*
*检查银行流水
*/
-(BOOL)checkAccountStatement{
NSLog(@"检查银行流水");
return YES;
}
/*
*放款
*/
-(BOOL)transactionLoans{
NSLog(@"放款");
return YES;
}
@end
房产销售人员的代码
//.h文件
#import <Foundation/Foundation.h>
@interface MarketPerson : NSObject
/*
*贷款买房
*/
-(void)loansToBuyHuose;
/*
*全款买房
*/
-(void)totalPaymentToBuyHuose;
@end
//.m文件
#import "MarketPerson.h"
#import "BuildPerson.h"
#import "BankPerson.h"
@interface MarketPerson ()
@property(nonatomic,strong)BuildPerson *buildPerson;
@property(nonatomic,strong)BankPerson *bankPerson;
@end
@implementation MarketPerson
- (instancetype)init
{
self = [super init];
if (self) {
_buildPerson =[[BuildPerson alloc]init];
_bankPerson = [[BankPerson alloc]init];
}
return self;
}
/*
*贷款买房
*/
-(void)loansToBuyHuose{
//第一步面签
[_bankPerson visaInterview];
//第二步先检查购房资格
[_bankPerson checkHousePurchaseQualification];
//第三步检查征信
[_bankPerson checkCredit];
//第四步检查银行流水
[_bankPerson checkAccountStatement];
//第五步放款
BOOL isYes = [_bankPerson transactionLoans];
//第六步是否申请贷款成功
if (isYes) {
[_buildPerson buildHouse];
}else{
NSLog(@"资格审核没通过,不能买房");
}
}
/*
*全款买房
*/
-(void)totalPaymentToBuyHuose{
//不需要贷款直接把钱给开发商建造房子
[_buildPerson buildHouse];
}
@end
买房子的人:
//.h文件
@interface BuyHouse : NSObject
/*
*买房子
*/
-(void)buyHuose;
@end
//.m文件
#import "BuyHouse.h"
#import "MarketPerson.h"
@implementation BuyHouse
/*
*买房子
*/
-(void)buyHuose{
NSLog(@"贷款买房子");
MarketPerson *marketPerson = [[MarketPerson alloc]init];
[marketPerson loansToBuyHuose];
}
@end
调用代码
/**************外观模式*************************/
BuyHouse *buyHuose = [[BuyHouse alloc]init];
[buyHuose buyHuose];
命令行打印的结果:
2018-06-22 18:18:53.716286+0800 DesignDemo[3266:234697] 贷款买房子
2018-06-22 18:18:53.716792+0800 DesignDemo[3266:234697] 面签
2018-06-22 18:18:53.716914+0800 DesignDemo[3266:234697] 检查购房资格
2018-06-22 18:18:53.717077+0800 DesignDemo[3266:234697] 检查征信
2018-06-22 18:18:53.717220+0800 DesignDemo[3266:234697] 检查银行流水
2018-06-22 18:18:53.717348+0800 DesignDemo[3266:234697] 放款
2018-06-22 18:18:53.717522+0800 DesignDemo[3266:234697] 建设房子
优缺点
(1)实现了子系统与客户端之间的松耦合关系。
(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。百度百科
总结
如果有写的不正确或者侵权的,希望大家给我提出来,我会及时修改。谢谢大家。