Чтение книги Элехии Уайта «Создание встроенных систем» (из О'Рейли) меня смутило из-за этих двух терминов: шаблоны фасадов и адаптеров. Объяснение, которое она дает для обоих, не совсем понятно.Фасад против шаблонов адаптеров для встроенных систем
Adapter Pattern (Паг, 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;
}
Надеется, что я объяснил достаточно хорошо себя. Заранее благодарю!!
Бросьте шаблон прокси, чтобы немного смутить :) – haylem