Adapter 패턴 - 2

지난 시간에 이어 계속해서 Adapter 패턴에 대해 알아보겠습니다. 지난 시간에는 Adapter가 필요한 콘크리트 코드에 대해 살펴봤고 이번 시간에는 실제적으로 콘크리트 코드가 interface 화 될 실제 driver interface를 살펴 보도록 하겠습니다.

 

궁극적으로 Adapter 패턴은 기존의 콘크리트 코드가 새로운 interface에 맞지 않아 중간에 Adapter를 끼워넣어 맞추는 역할을 하게 됩니다. 이번 시간에는 그중에 새로운 interface에 대해 살펴보겠습니다.

typedef enum
{
	DRIVER_ID_UART1,
	DRIVER_ID_UART2,
	DRIVER_ID_DISPLAY,
	DRIVER_MAX,
}driver_id_t;

typedef struct 
{
	driver_id_t id;
	bool (*open)(void);
	bool (*close)(void);
	bool (*read)(uint32_t addr, uint8_t *value, uint32_t len);
	bool (*write)(void);
}driver_t;

extern bool set_driver(driver_t *driver);
extern driver_t *get_driver(driver_id_t id);
extern bool remove_driver(driver_id_t id);
extern bool remove_all_driver(void);
 

driver_id_t 를 통해 앞으로 생성될 driver들의 고유 번호를 부여합니다. 그리고 기본적인 Open, Close, Read, Write들을 구현 하도록 되어 있습니다. 필요시 더 많은 기능을 넣을 수 있습니다. 아무래도 UART 같은 경우에는 observer 핸들러를 넣을 수 있는 함수도 필요할 수 있습니다.

 

set_driver() 에 생성된 driver를 등록하게 되고 등록된 driver를 가져오거나 삭제등을 할 수 있도록 합니다. 아래 코드에서 실제 이러한 기능을 구현해 보도록 하겠습니다.

static driver_t *drivers[DRIVER_MAX] = {null};

bool set_driver(driver_t *driver)
{
	if(driver->id >= DRIVER_MAX)
	{
		return false;
	}

	drivers[driver->id] = driver;

	return true;
}

driver_t *get_driver(driver_id_t id)
{
	if(id >= DRIVER_MAX)
	{
		return false;
	}

	if(drivers[id] == null)
	{
		return false;
	}

	return drivers[id];
}

bool remove_driver(driver_id_t id)
{
	if(drivers[id] == null)
	{
		return false;
	}

	if(drivers[id]->close() == true)
	{
		drivers[id] = null;
		return true;
	}

	return false;
}

bool remove_all_driver(void)
{
	for(int8_t i=0; i<DRIVER_MAX; i++)
	{
		remove_driver(i);
	}

	return true;
}
 

실제 구현은 보시는 것과 같이 간단합니다. driver라는 자료구조에 하나씩 등록하고 요청하면 전달해 주는 역할만 하면 됩니다.

 

여기서 주목해야 할 사항은 remove_all_driver 입니다. 실제 이러한 interface없이 콘크리트 코드만 존재할 경우 모든 device driver를 끄려면 각각의 close 함수를 모두 불러와야합니다. 실제로 절전 모드라든가 슬립모드 시 각 장치들을 끄는 경우가 많은데, 일일히 찾아서 끄는게 귀찮고 실수하기 쉽습니다. 그런데 이렇게 설계하면 전부 끄는게 가능해 집니다.

 

다음 시간에는 기존의 display와 driver interface를 잇는 Adapter를 만들어 보도록 하겠습니다.

'▶ C Application > 디자인 패턴' 카테고리의 다른 글

Builder 패턴 - 키(Key)처리  (1) 2024.01.17
Adapter 패턴 - 3  (0) 2023.12.24
Adapter 패턴 - 1  (0) 2023.12.24
Factory method 패턴  (0) 2023.12.23
소프트웨어 Timer 만들기  (0) 2023.12.20