外观模式的解析-iOS

外观模式的解析-iOS

其他设计模式的介绍

1、简单工厂模式、工厂模式、抽象工厂模式的解析-iOS
2、建造者模式的解析-iOS
3、单例模式的解析-iOS
4、原型模式的解析-iOS
5、代理模式的解析-iOS
6、适配器模式的解析-iOS
7、装饰器模式的解析-iOS
8、外观模式的解析-iOS
9、桥接模式的解析-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)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。百度百科

总结

如果有写的不正确或者侵权的,希望大家给我提出来,我会及时修改。谢谢大家。

猜你喜欢

转载自blog.csdn.net/u014644610/article/details/80777284
今日推荐