2023年3月4日 星期六

C++:簡介 Adapter pattern 以及與 Strategy pattern 的比較

本文為 C++ Software Design 書的第 24 節內容。

Adapter pattern 的目的是轉化一個類的介面至另一個類。一個很常見的例子是 std 的 Container adapters:
template<typename T,
         typename Container = std::deque<T>>
class stack;

template<typename T,
         typename Container = std::deque<T>>
class queue;

template<typename T,
         typename Container = std::vector<T>,
         typename Cmp = std::less<typename Container::value_type>>
class priority_queue;
比如說 std::stack 就是將 Container 類別裡的函數 adapt 成 stack 的函數,像是 top()、empty()、pop() 等等。除了 std::deque 以外,Container 也可以使用 std::vector 與 std::list。 從程式的結構與語法來看,Adapter pattern 與 Strategy pattern 非常類似。兩者主要的差別是在背後的動機:Adapter pattern 的目的是整合不同的 API 至現有的介面中;而 Strategy pattern 的目的是能夠從外面(也就是使用者)的角度設定此類的行為。另外相較於 Strategy pattern 來說,Adapter pattern 不需要每次都重新設定。