Многие сложные системы состоят из огромной кучи компонент. Так же и в жизни, очень часто для совершения одного основного действия, мы должны выполнить много маленьких.
К примеру, чтобы пойти в кино нам надо:
- Посмотреть расписание фильмов, выбрать фильм, посмотреть когда есть сеансы, посмотреть когда у нас есть время.
- Необходимо купить билет, для этого ввести номер карточки, секретный код, дождаться снятия денег, распечатать билет.
- Приехать в кинотеатр, припарковать машину, купить попкорн, найти места, смотреть.
И все это для того, чтобы просто посмотреть фильм, который нам, очень вероятно, не понравится.
Или же возьмем пример 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!
Немає коментарів:
Дописати коментар