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
原文地址:https://www.cnblogs.com/madpanda/p/4677292.html