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