Objective-C編程之道 iOS設(shè)計(jì)模式解析
iOS設(shè)計(jì)模式解析-工廠模式
iOS設(shè)計(jì)模式解析-抽象工廠模式
iOS設(shè)計(jì)模式解析-外觀模式
iOS設(shè)計(jì)模式解析-中介者模式
iOS設(shè)計(jì)模式解析-觀察者模式
iOS設(shè)計(jì)模式解析-裝飾模式
iOS設(shè)計(jì)模式解析-責(zé)任鏈模式
iOS設(shè)計(jì)模式解析-模板方法
iOS設(shè)計(jì)模式解析-策略模式
iOS設(shè)計(jì)模式解析-享元模式
iOS設(shè)計(jì)模式解析-代碼地址
何為外觀模式
外觀模式為子系統(tǒng)中一組不同的接口提供統(tǒng)一的接口。外觀定義了上層接口,通過(guò)降低復(fù)雜度和隱藏子系統(tǒng)間的通信及依存關(guān)系雌芽,讓子系統(tǒng)更易于使用。
外觀模式:為系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的接口,外觀定義一個(gè)高層接口秋麸,讓子系統(tǒng)更易于使用心傀。
何時(shí)使用外觀模式
在以下情形,自然會(huì)考慮使用這一模式杖刷。
- 子系統(tǒng)正逐漸變得復(fù)雜励饵。應(yīng)用模式的過(guò)程中演化出許多類』迹可以使用外觀為這些子系統(tǒng)類提供一個(gè)較簡(jiǎn)單的接口役听。
- 可以使用外觀對(duì)子系統(tǒng)進(jìn)行分層。每個(gè)子系統(tǒng)級(jí)別有一個(gè)外觀作為入口點(diǎn)表窘。讓他們通過(guò)其外觀進(jìn)行通信典予,可以簡(jiǎn)化它們的依賴關(guān)系
下面將用出租車司機(jī)的例子實(shí)現(xiàn)外觀模式,以闡述其基本概念乐严。
Car
#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
{
}
- (void) changeGears
{
}
- (void) pressAccelerator
{
}
- (void) pressBrakes
{
}
- (void) releaseAccelerator
{
}
@end
Car定義了幾個(gè)操作內(nèi)部對(duì)象用的方法瘤袖,如releaseBrakes(松剎車)、changeGears(換擋)昂验、pressAccelerator(踩油門)捂敌、pressBrakes(踩剎車)和releaseAccelerator(松油門)〖惹伲客戶端要想使用Car的內(nèi)部對(duì)象占婉,必須了解如何使用這些方法進(jìn)行操作
Taximeter
#import <Foundation/Foundation.h>
@interface Taximeter : NSObject
- (void) start;
- (void) stop;
@end
#import "Taximeter.h"
@implementation Taximeter
- (void) start
{
}
- (void) stop
{
}
@end
雖然Taximeter本身是個(gè)復(fù)雜系統(tǒng),但它有兩個(gè)讓客戶端操作其對(duì)象的方法甫恩。start和stop方法只是讓Taximeter開始或停止逆济。目前,出租車服務(wù)系統(tǒng)里面有兩個(gè)復(fù)雜的子系統(tǒng)。需要一個(gè)CabDriver(出租車司機(jī))作為“外觀”以簡(jiǎn)化接口奖慌。
CabDriver
#import <Foundation/Foundation.h>
#import "Car.h"
#import "Taximeter.h"
#import <UIKit/UIKit.h>
@interface CabDriver : NSObject
- (void) driveToLocation:(CGPoint) x;
@end
#import "CabDriver.h"
@implementation CabDriver
- (void) driveToLocation:(CGPoint) x
{
// ...
// set off the taximeter
Taximeter *meter = [[Taximeter alloc] init];
[meter start];
// operate the vehicle
// until location x is reached
Car *car = [[Car alloc] init];
[car releaseBrakes];
[car changeGears];
[car pressAccelerator];
// ...
// when it's reached location x
// then stop the car and taximeter
[car releaseAccelerator];
[car pressBrakes];
[meter stop];
// ...
}
@end
在driveToLocation:方法中抛虫,首先啟動(dòng)一個(gè)Taximeter(計(jì)價(jià)器)對(duì)象,讓它從那一刻開始計(jì)價(jià)简僧。然后轉(zhuǎn)到Car(汽車)對(duì)象建椰,開始對(duì)它進(jìn)行操作。最后讓Taximeter(計(jì)價(jià)器)對(duì)象停止計(jì)價(jià)涎劈。這樣服務(wù)就結(jié)束了广凸。
總結(jié):當(dāng)程序逐漸變大變復(fù)雜時(shí),會(huì)有越來(lái)越多小型的類從設(shè)計(jì)和應(yīng)用模式中演化而來(lái)蛛枚。如果沒(méi)有一種簡(jiǎn)化的方法來(lái)使用這些類谅海,客戶端代碼最終將變得越來(lái)越大、越來(lái)越難以理解蹦浦,而且扭吁,維護(hù)起來(lái)會(huì)繁瑣無(wú)趣。外觀有助于提供一種更為簡(jiǎn)潔的方式來(lái)使用子系統(tǒng)中的這些類盲镶。處理這些子系統(tǒng)類的默認(rèn)行為的侥袜,可能只是定義在外觀中的一個(gè)簡(jiǎn)單的方法,而不必直接去使用這些類溉贿。