標籤:
面板模式
外觀設計模式和適配器差不多,不過它門對對象控制的粒度不同,適配器一般只是控制一個系統和用戶端的對接。外觀則是用來抽象多個系統一起工作。
外觀一般具有多個子系統,所以外觀應持有多個子系統的引用,同構向高層提供抽象介面實現封裝。外觀一般是可以多次使用的,比如一個龐大的系統中,可以多次使用外觀來進行封裝,然後再對外觀使用外觀封裝達到多層抽象的目的。
使用情境
子系統正逐漸層得複雜。應用模式的過程中演化出來許多類。可以使用外觀為這些子系統類提供一個較簡單的介面。
可以使用外觀對子系統進行分層。每個子系統層級有一個外觀作為進入點。讓它們通過其外觀進行通訊,可以簡化它們的依賴關係。
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] start2015-07-26 11:06:38.005 Faced[656:20064] releaseBrakes2015-07-26 11:06:38.005 Faced[656:20064] changeGears2015-07-26 11:06:38.006 Faced[656:20064] pressAccelerator2015-07-26 11:06:38.006 Faced[656:20064] releaseAccelerator2015-07-26 11:06:38.006 Faced[656:20064] pressBrakes2015-07-26 11:06:38.006 Faced[656:20064] stop
Objective-C設計模式——外觀Faced(介面適配)