zoukankan      html  css  js  c++  java
  • Objective-C设计模式——外观Faced(接口适配)

    外观模式

    外观设计模式和适配器差不多,不过它门对对象控制的粒度不同,适配器一般只是控制一个系统和客户端的对接。外观则是用来抽象多个系统一起工作。

    外观一般具有多个子系统,所以外观应持有多个子系统的引用,同构向高层提供抽象接口实现封装。外观一般是可以多次使用的,比如一个庞大的系统中,可以多次使用外观来进行封装,然后再对外观使用外观封装达到多层抽象的目的。

    使用场景

    子系统正逐渐变得复杂。应用模式的过程中演化出来许多类。可以使用外观为这些子系统类提供一个较简单的接口。

    可以使用外观对子系统进行分层。每个子系统级别有一个外观作为入口点。让它们通过其外观进行通信,可以简化它们的依赖关系。

    Demo

    因为也是接口适配,只不过是应用场景不同,差异并不是很大,就不详细描述了。

    用打的的场景来模拟外观模式,打的存在司机开车和计价两个系统,用Faced进行封装,提供

    driveToLocation:接口

    #import <Foundation/Foundation.h>
    
    @interface Taximeter : NSObject
    
    -(void)start;
    -(void)stop;
    
    @end
    
    #import "Taximeter.h"
    
    @implementation Taximeter
    
    -(void)start
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
    
    -(void)stop
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
    
    @end
    
    
    #import <Foundation/Foundation.h>
    
    @interface Car : NSObject
    
    -(void) releaseBrakes;
    -(void) changeGears;
    -(void) pressAccelerator;
    -(void) pressBrakes;
    -(void) releaseAccelerator;
    
    @end
    
    #import "Car.h"
    
    @implementation Car
    
    -(void) releaseBrakes
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
    
    -(void) changeGears
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
    
    -(void) pressAccelerator
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
    
    -(void) pressBrakes
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
    
    -(void) releaseAccelerator
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
    
    @end

    Faced

    #import <Foundation/Foundation.h>
    
    @interface Faced : NSObject
    
    -(void)driveToLocation:(CGPoint)x;
    
    @end
    
    #import "Faced.h"
    #import "Taximeter.h"
    #import "Car.h"
    @implementation Faced
    
    -(void)driveToLocation:(CGPoint)x
    {
        Taximeter *meter = [Taximeter new];
        [meter start];
        
        Car *car = [Car new];
        [car releaseBrakes];
        [car changeGears];
        [car pressAccelerator];
        
        [car releaseAccelerator];
        [car pressBrakes];
        [meter stop];
    }
    
    @end

    客户端和结果

    [[Faced new] driveToLocation:CGPointZero];
    
    2015-07-26 11:06:38.004 Faced[656:20064] start
    2015-07-26 11:06:38.005 Faced[656:20064] releaseBrakes
    2015-07-26 11:06:38.005 Faced[656:20064] changeGears
    2015-07-26 11:06:38.006 Faced[656:20064] pressAccelerator
    2015-07-26 11:06:38.006 Faced[656:20064] releaseAccelerator
    2015-07-26 11:06:38.006 Faced[656:20064] pressBrakes
    2015-07-26 11:06:38.006 Faced[656:20064] stop
  • 相关阅读:
    一个小型软件公司关于研发、管理、实施、团队等讨论
    二十七、EFW框架BS系统开发中的MVC模式探讨
    EFW框架问题收集与答疑
    EFW框架源代码版本升级记录说明
    【开源EFW框架】框架中自定义控件GridBoxCard使用实例说明
    二十七(序幕)、【开源】EFW框架破茧成蝶
    二十六、【开源框架】EFW框架Winform前端开发之Grid++Report报表、条形码、Excel导出、图表控件
    二十五、【开源】EFW框架Winform前端开发之强大的自定义控件库
    二十四、【开源】EFW框架Winform前端开发之项目结构说明和调试方法
    二十三、【开源】EFW框架Web前端开发之常用组件(FusionCharts图表、ReportAll报表等)
  • 原文地址:https://www.cnblogs.com/madpanda/p/4677292.html
Copyright © 2011-2022 走看看