外观模式

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

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

使用场景

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

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

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];

-- ::38.004 Faced[:] start
-- ::38.005 Faced[:] releaseBrakes
-- ::38.005 Faced[:] changeGears
-- ::38.006 Faced[:] pressAccelerator
-- ::38.006 Faced[:] releaseAccelerator
-- ::38.006 Faced[:] pressBrakes
-- ::38.006 Faced[:] stop

最新文章

  1. Linux学习笔记(8)-exec族函数
  2. Windows出现带空格文件名无法删除
  3. VC++ error C2248: &ldquo;CObject::CObject&rdquo;: 无法访问 private 成员(在&ldquo;CObject&rdquo;类中声明)
  4. PostgreSQL模仿Oracle的instr函数
  5. ACM题目————图的广度优先搜索
  6. hiho_1052_基因工程
  7. 不复杂的Autofac注入
  8. 4010: [HNOI2015]菜肴制作
  9. (转)了解了这些才能开始发挥jQuery的威力
  10. A Corrupt Mayor&#39;s Performance Art(线段树区间更新+位运算,颜色段种类)
  11. winform,wpf全屏 还显示任务栏的解决方法
  12. ural 1057(数位dp)
  13. Ecmall系统自带的分页功能使用
  14. uu云验证码识别平台,验证码,验证码识别,全自动验证码识别技术,优优云全自动打码,代答题系统,优优云远程打码平台,uu云打码
  15. JQuery.Ajax + 跨域 (crossDomain) + POST + JSON + WCF RESTful, 5大陷阱和解决方案
  16. golang路上的小学生系列--使用reflect查找package路径
  17. windows中的常用Dos命令
  18. win7 配置DNS
  19. nw 系统托盘的添加方式,以及ajax失效问题
  20. centos6 和 centos7 网络配置

热门文章

  1. Creo二次开发—内存处理
  2. 十分简便的APK反编译(Mac 版本号 具体解释)
  3. A program to print Fahrenheit-Celsius table with floating-point values
  4. ios33--线程通信
  5. iOS开发个人开发账号的证书详细使用及介绍
  6. 【CSU 1079】树上的查询
  7. iphone分辨率大全
  8. java 语法 —— 数组
  9. EasyUI 取得选中行数据
  10. MySQL 操作语句