外观模式

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

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

使用场景

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

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

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

转载于:https://www.cnblogs.com/madpanda/p/4677292.html

Objective-C设计模式——外观Faced(接口适配)相关推荐

  1. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  2. 设计模式--------外观模式

    设计模式--------外观模式 介绍外观模式的四大问题 现在的写法有什么问题吗? 为什么要用外观模式? 什么是外观模式? 外观模式有什么好处? 使用一个例子进行问题的说明 假如要制作一个智能系统,要 ...

  3. Dot Net设计模式—外观模式

    1.概述1.1意图 外观模式定义了一个将子系统的一组接口集成在一起的高层接口,以提供一个一致的界面.通过这个界面,其他系统可以方便地调用子系统中的功能,而忽略子系统内部发生的变化.1.2使用场合 在如 ...

  4. Python设计模式二:接口类和抽象类(Python接口设计)

    系列文章目录 Python设计模式一:面向对象编程 文章目录 系列文章目录 前言 一.接口类和抽象类是什么? 基于接口编程而非实现 二.Python里如何实现接口类和抽象类? 三.接口类和抽象类的应用 ...

  5. 接口隔离原则——举例说明Java设计模式中的接口隔离原则

    举例说明Java设计模式中的接口隔离原则 一.举例说明 1.反例 (1)类图说明 (2)代码说明 (3)测试 (4)分析缺点(总结) 2.正例 (1)类图说明 (2)代码说明 (3)测试 (4)方案评 ...

  6. 趣谈设计模式 | 外观模式(Facade):为子系统提供高粒度接口

    文章目录 案例:自动驾驶飞机 外观模式 总结 完整代码与文档 案例:自动驾驶飞机 随着自动驾驶汽车的大卖,特X拉开始把目标转向飞行领域,打算开发出一款能够完全自动行驶的飞机,系统初步的设计如下 我们将 ...

  7. 如何定义适配器adapter类_设计模式22-Adapter(适配器)模式-组件接口适配

    在软件开发过程中,有时候系统的数据和行为都正确,但接口不符合,这时候我们就应该考虑使用适配器模式,适配器的作用即将一个类的接口转换成客户希望的另外一个接口.它使得原本由于接口不兼容而不能一起工作的那些 ...

  8. JavaScript设计模式(三):结构型设计模式-外观模式、适配器模式、代理模式、装饰者模式、桥接模式、组合模式、享元模式

    JavaScript设计模式 - 结构型设计模式 套餐服务-外观模式 外观模式(Facade) 水管弯弯-适配器模式 适配器模式(Adapter) 适配异类框架 参数适配 牛郎织女-代理模式 代理模式 ...

  9. [设计模式]外观模式

    1. 定义 外观模式 提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更加容易使用. 外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可 ...

最新文章

  1. 艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~
  2. 微信卡券 - 微信公众平台 整理笔记
  3. 这个超时问题花了我两周才解决!
  4. COCO 54.7mAP!DetectoRS目标检测:改进主干网,成就新高度!
  5. linux 使用 /proc 文件系统
  6. Linux sed命令实例
  7. 仿淘宝网站基于html网页模板设计静态网页模板参考.rar(项目源码)
  8. 计算机服务大部分被禁用,Win10系统其中的服务被禁用无法打开系统功能解法
  9. 三种定位+堆叠+li小黑点变图片
  10. 怎么在当前文件目录下打开CMD
  11. TSFS终端存储文件系统边缘计算项目介绍-海洋
  12. flutter 屏幕截图,超出屏幕部分截图
  13. 最新360脱壳详细教程(有图有真相
  14. iOS-图片轮播-SDCycleSCrollView的使用
  15. 无限流量与5G要来,我们距淘汰Wi-Fi还有多远?
  16. 2017acl---An Unsupervised Neural Attention Model for Aspect Extraction笔记
  17. HDU 4544 湫湫系列故事——消灭兔子 (贪心+优先队列)
  18. Cocos2d-x常见面试题
  19. 微信小程序进度条组件自定义数字_微信小程序之圆形进度条(自定义组件)
  20. Delphi DeWebSDK

热门文章

  1. php多线程编程代码实例
  2. jquery取值,赋值,以及下拉框获取选中value值
  3. 每天一个linux命令(12):more命令
  4. Java反编译的代码可以修改么
  5. C++ 模板:template
  6. 搭建Ubuntu18.04+Anaconda3.x+Pycharm+SimpleITK(二)
  7. linux 退出服务器_Vue实战091:Vue项目部署到nginx服务器
  8. matlab学习日记,MATLAB学习笔记---DAY1
  9. 西安网络推广教大家如何提高网站抓取量?
  10. 长沙网络推广浅析新站怎么做会对排名提升更有帮助?