Прочитав книгу Элесиаса Уайта "Making Embedded Systems" (от O'Reilly), я запутался из-за этих двух терминов: фасады и шаблоны адаптеров. Объяснение, которое она дает обоим, совершенно непонятно.
Шаблон адаптера (стр. 19): "(... Иногда называется оболочкой) Преобразует интерфейс объекта в более простой для клиента ... Часто адаптеры написаны поверх программных API, чтобы скрыть уродливые интерфейсы ... ".
Узор фасада (стр. 86): "... Он обеспечивает упрощенный интерфейс для фрагмента кода ...". Затем он говорит ".. . Шаблон адаптера - это более общая версия шаблона фасада ».
К сожалению, оба термина кажутся мне похожими.
Исходя из других определений на этом (и других) сайтах, большинство людей говорят: «Шаблон адаптера обеспечивает совместимость двух несовместимых интерфейсов». Что в этом контексте означает слово "несовместимо"?
Большинство сайтов и книг дают свои определения шаблонов с более высокого уровня, отличного от точки зрения встроенной системы (простой C, а не ООП), поэтому приведенные примеры действительно не ясны.
Стоит упомянуть, что, хотя книга является отличным источником знаний как для новичков, так и для профессионалов, в нее не входило так много кода, поэтому следует выяснить такого рода определения.
Я попытался понять их с помощью пары примеров, которые я написал для себя, не могли бы вы указать мне, правильное мое понимание или нет?
Пример 1, узор фасада:
/* This is a fancy API that I want to 'facade' */
fancy_gui_DrawWidget(parent, id, x0, y0, x1, y1, text, txt_color, back_color, brdr_color, draw_callback(), ... and more parameters)
{
/* draw the widget */
}
/* Here I'm using the 'facade pattern' */
mygui_DrawButton(parent, id, x, y, width, height, text)
{
...
x1=x+width;
y1=y+height;
...
fancy_gui_DrawWidget(parent, id, x, y, x1, y1, text, BLACK, WHITE, ORANGE, button_draw_fn, ... and some more parameters needed);
}
Пример 2, шаблон адаптера:
/* Ugly interface that I want to 'adapt' (from LPC17xx NXP's CMSIS library) */
uint32_t UART_Send(
LPC_UART_TypeDef *UARTx,
uint8_t *txbuf,
uint32_t buflen,
TRANSFER_BLOCK_Type flag)
{
/* transmits the txbuf */
}
/* Here I'm using the 'adapter pattern' (I think so) for a good looking interface */
int uart0_Send(buffer, len_buffer)
{
/* Do some stuff */
len=UART_Send(uart0_handler,buffer,len_buffer, BLOCKING);
if(len!=len_buffer)
return 0;
return 1;
}
Надеюсь, я сам достаточно хорошо объяснил. Заранее благодарю!!