外观模式
外观设计模式和适配器差不多,不过它门对对象控制的粒度不同,适配器一般只是控制一个系统和客户端的对接。外观则是用来抽象多个系统一起工作。
外观一般具有多个子系统,所以外观应持有多个子系统的引用,同构向高层提供抽象接口实现封装。外观一般是可以多次使用的,比如一个庞大的系统中,可以多次使用外观来进行封装,然后再对外观使用外观封装达到多层抽象的目的。
使用场景
子系统正逐渐变得复杂。应用模式的过程中演化出来许多类。可以使用外观为这些子系统类提供一个较简单的接口。
可以使用外观对子系统进行分层。每个子系统级别有一个外观作为入口点。让它们通过其外观进行通信,可以简化它们的依赖关系。
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
时间: 2024-11-06 07:26:34