пʼятниця, 25 серпня 2017 р.

Facade

Многие сложные системы состоят из огромной кучи компонент. Так же и в жизни, очень часто для совершения одного основного действия, мы должны выполнить много маленьких.

К примеру, чтобы пойти в кино нам надо:

  1. Посмотреть расписание фильмов, выбрать фильм, посмотреть когда есть сеансы, посмотреть когда у нас есть время.
  2. Необходимо купить билет, для этого ввести номер карточки, секретный код, дождаться снятия денег, распечатать билет.
  3. Приехать в кинотеатр, припарковать машину, купить попкорн, найти места, смотреть.

И все это для того, чтобы просто посмотреть фильм, который нам, очень вероятно, не понравится.

Или же возьмем пример Amazon – покупка с одного клика – как много систем задействовано в операции покупки? И проверка Вашей карточки, и проверка Вашего адреса, проверка товара на складе, проверка или возможна доставка даного товара в даную точку мира... В результате очень много действий которые происходят всего по одному клику.

Для таких вот процесов был изобретен паттерн – Фасад (Facade) который предоставляет унифицированный интерфейса к большому количеству интерфейсов системы, в следствии чего систему стает гораздо проще в использовании.

Давайте, попробуем создать систему которая нас переносит в другую точку мира с одного нажатия кнопки! С начала нам нужна система которая проложит путь от нашего места перебывания в место назначения:

@interface ASPathFinder : NSObject

- (void)findCurrentLocation;

- (void)findLocationToTravel:(NSString *)location;

- (void)makeRoute;

@end
@implementation ASPathFinder

- (void)findCurrentLocation {
    NSLog(@"Finding your location. Hmmm, here you are!");
}

- (void)findLocationToTravel:(NSString *)location {
    NSLog(@"So you wanna travell to %@", location);
}

- (void)makeRoute {
    NSLog(@"OK, to travell to this location we are using google maps....");
    // looking for path in google maps
}

Естественно нам необходима сама система заказа транспорта и собственно путешествия:

@interface ASTravellEngine : NSObject

- (void)findTransport;

- (void)orderTransport;

- (void)travel;

@end
@implementation ASTravellEngine

- (void)findTransport {
    NSLog(@"OK, to travell there you will probabply need dragon!Arghhhhh");
}

- (void)orderTransport {
    NSLog(@"Maaaam, can I order a dragon?... Yes... Yes, green one... Yes, with fire!... No, not a dragon of death... Thank you!");
}

- (void)travel {
    NSLog(@"Maaan, you are flying on dragon!");
}

@end

Ну и какие же путешествия без билетика:

@interface ASTicketPrinitingSystem : NSObject

- (void)createTicket;

- (void)printingTicket;

@end
@implementation ASTicketPrinitingSystem

- (void)createTicket {
    NSLog(@"Connecting to our ticketing system...");
}

- (void)printingTicket {
    NSLog(@"Hmmm, ticket for travelling on the green dragon.Interesting...");
}

@end

А теперь, давайте создадим единый доступ ко всем этим системам:

@interface ASTravellSystemFacade : NSObject

- (void)travellTo:(NSString *)location;

@end
@implementation ASTravellSystemFacade

- (void)travellTo:(NSString *)location {
    ASPathFinder *pathFinder = [ASPathFinder new];
    ASTravellEngine *travellEngine = [ASTravellEngine new];
    ASTicketPrinitingSystem *ticketPrinting = [ASTicketPrinitingSystem new];
    
    [pathFinder findCurrentLocation];
    [pathFinder findLocationToTravel:location];
    [pathFinder makeRoute];
    
    [travellEngine findTransport];
    [travellEngine orderTransport];
    
    [ticketPrinting createTicket];
    [ticketPrinting printingTicket];
    
    [travellEngine travel];
}

@end

Как видим, наш фасад знает все про все системы, потому в одном методе он берет и транспортирует нас куда следует. Код теста элементарен:

    ASTravellSystemFacade *facade = [ASTravellSystemFacade new];
    [facade travellTo:@"Lviv"];

И конечно же лог:

2017-08-25 01:07:03.450 PatternsObjC[1296:153343] Finding your location. Hmmm, here you are!
2017-08-25 01:07:03.450 PatternsObjC[1296:153343] So you wanna travell to Lviv
2017-08-25 01:07:03.450 PatternsObjC[1296:153343] OK, to travell to this location we are using google maps....
2017-08-25 01:07:03.450 PatternsObjC[1296:153343] OK, to travell there you will probabply need dragon!Arghhhhh
2017-08-25 01:07:03.451 PatternsObjC[1296:153343] Maaaam, can I order a dragon?... Yes... Yes, green one... Yes, with fire!... No, not a dragon of death... Thank you!
2017-08-25 01:07:03.451 PatternsObjC[1296:153343] Connecting to our ticketing system...
2017-08-25 01:07:03.451 PatternsObjC[1296:153343] Hmmm, ticket for travelling on the green dragon.Interesting...
2017-08-25 01:07:03.451 PatternsObjC[1296:153343] Maaan, you are flying on dragon!

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments