美文网首页
外观模式(Facade)

外观模式(Facade)

作者: 傻傻小萝卜 | 来源:发表于2017-04-13 17:24 被阅读19次

    文章转自iOS设计模式:外观模式

    基本概念

    外观模式:为子系统的一组接口提供一个一致的界面,此模式定义一个高层接口,这个接口使的这一子系统更加容易调用。

    在以下情况下可以考虑使用外观模式:

    (1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。

    (2)开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

    (3)维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

    我们看一下具体的使用场景吧,还记得前面文章中我们提到买车的事吧,今天还是拿买车说事。前面我们选好了车,现在进入到买车的具体流程中。你从4S店买一辆车,几乎要涉及到店里的每个部门,比如财务部门、销售部门、售后服务部门等等。

    那么问题来了,我们买一辆车真的就需要把4S店的每个部门都跑一边吗?其实没必要,我们只要跟接待自己的销售服务人员沟通好就行了,剩下的事情,她可以帮我们做。比如说:我们只要选好付款方式,然后去交钱就完事了,并不关心财务部门内部那些全款买车的流程和贷款买车的流程;也不用关心怎样去销售部门拿赠品;也不用关心售后服务部门谁来帮你做那些服务内容;这一切我们只要跟接待自己的销售人员沟通就好了。

    代码实现

    这个例子中4S店的各个部门其实就类似一个个的子系统,而接待我们的美女销售就是外观角色。下面我们看一下具体的代码实现。

    先看各个子系统的接口实现吧:

    (1)LHFinance:财务部门管理:现金付款、申请贷款、审核贷款、放款等业务。

    #import@interface LHFinance : NSObject

    // 现金支付

    - (void)cashPayment;

    // 申请贷款

    - (BOOL)applyLoan;

    // 审核贷款

    - (BOOL)auditLoan;

    // 放款

    - (BOOL)getLoad;

    @end

    (2)销售部门管理:车辆调配、配件、赠品等业务。

    #import@interface LHSales : NSObject

    // 提车

    - (void)provideCar;

    // 车贴膜

    - (void)carFilm;

    // 行车记录仪

    - (void)tachograph;

    // 发动机护板

    - (void)engineGuard;

    // 脚垫

    - (void)mat;

    @end

    (3)售后服务部门管理:售前服务(贴膜、装配件、洗车、上牌等服务)和售后服务(维修、保养等)

    #import@interface LHService : NSObject

    // 洗车服务

    - (void)carWash;

    // 上牌服务

    - (void)applyPlate;

    // 贴膜服务

    - (void)filming;

    // 安装行车记录仪

    - (void)installTachograph;

    @end

    上面是我们的子系统接口,对于客户来说没必要关心这么多业务,所以我们定义一个高层接口类来统一各个子系统的接口,这个类就是我们的4S销售接待人员的角色类:LHService。

    #import

    @interface LH4SWaiter : NSObject

    - (void)buyCarWithCash;// 现金买车

    - (void)buyCarWithLoad;// 贷款买车

    @end

    #import "LH4SWaiter.h"

    #import "LHFinance.h"

    #import "LHSales.h"

    #import "LHService.h"

    @interface LH4SWaiter ()

    {

    LHFinance   *finance;// 财务部门

    LHSales     *sales;// 销售部门

    LHService   *service;// 售后服务部门

    }

    @end

    @implementation LH4SWaiter

    - (instancetype)init

    {

    self = [super init];

    if (self) {

    finance = [[LHFinance alloc] init];

    sales = [[LHSales alloc] init];

    service = [[LHService alloc] init];

    }

    return self;

    }

    // 现金买车

    - (void)buyCarWithCash{

    // 现金支付

    [finance cashPayment];

    // 赠送礼品

    [self gift];

    // 提供服务

    [self service];

    }

    // 贷款买车

    - (void)buyCarWithLoad{

    BOOL _isSuccess = [finance applyLoan];

    // 如果贷款审批下来,则提车、送赠品和服务

    if (_isSuccess) {

    [sales provideCar];

    [self gift];

    [self service];

    }else{

    NSLog(@"贷款审批未通过!");

    }

    }

    // 赠品

    - (void)gift{

    NSLog(@"赠品有:");

    [sales carFilm];

    [sales tachograph];

    [sales engineGuard];

    [sales mat];

    }

    // 服务

    - (void)service{

    NSLog(@"售后服务:");

    [service carWash];

    [service applyPlate];

    [service filming];

    [service installTachograph];

    }

    @end

    这样客户只要告诉她我是现金支付还是贷款支付,剩余的事情她全部帮你做了,比如贷款的话,贷款的申请、审核、放款等。再比如哪些赠品,哪些服务她都帮你安排好。

    客户端只要简单调用就可以了:

    #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

    // 现金买车

    - (IBAction)btnCashEvent:(UIButton *)sender {

    [_waiter buyCarWithCash];

    }

    // 贷款买车

    - (IBAction)btnLoanEvent:(UIButton *)sender {

    [_waiter buyCarWithLoad];

    }

    @end

    输出结果

    相关文章

      网友评论

          本文标题:外观模式(Facade)

          本文链接:https://www.haomeiwen.com/subject/zpmbattx.html