アダプターパターンについては「ギャング・オブ・フォー」のデザインパターンを読みました。しかし、実装セクションのパラグラフ2.cで、プラグ可能なアダプターがパラメーター化されたアダプターを使用することについて読みましたが、例がSmalltalkにあるため、理解できません。誰でもJavaまたはC++で詳細を説明できますか?すみません、私の英語はとても悪いです。ありがとう
2 に答える
まず、特にC ++では、パターンの使用に深く入り込まないように少し注意する必要があります(多くのC ++プログラマーは、ある程度の懐疑的なデザインパターンに重点を置くようになりました)。
そうは言っても、C++を使用しているほとんどの人が本で説明されているアプローチを使用するのではないかと思います。この本では、委任先のインターフェースを定義する抽象クラスから継承するミックスインタイプのアプローチについて説明しています。彼らの例では、いくつかの抽象的なDisplayableObjectクラスに関して記述されたTreeDisplayクラスがあり、次にDisplayableObjectからの(おそらく複数の、できればプライベートな)継承を介して特定のタイプのTreeDisplayを作成します。
すでにこのアーキテクチャを使用している既存のプロジェクトを除いて、この方法でC++を作成している人を想像することはできません。誰かがこれを実装するために新しいC++を書いている場合、彼らはほぼ確実にTreeDisplayをテンプレートにし、DisplayableObjectをテンプレートパラメーターにします。
template <class DisplayableObject>
class TreeDisplay {
DisplayableObject const &root;
public:
TreeDisplay(DisplayableObject const &d) : root(d) {}
display(graphic const *g);
void build_tree(DisplayableObject const &d=root) {
for (auto child : d.get_children) {
add_node(d.CreateGraphicNode(this, child));
build_tree(child); // recursively add child's children
}
}
}
その場合、表示可能なオブジェクトは次のようになります。
class DirectoryBrowser {
std::vector<directory> children;
public:
std::vector<directory> &get_children() { return children; }
void CreateGraphicNode(TreeDisplay *t, directory const &d) {
t->display(d.name);
}
};
これは確かに本で説明されている実装とは一致しませんが、上で述べたように、本で説明されている方法で今日C++を書いている人を想像することはできません。余談ですが、DirectoryBrowserの内部データへの参照を直接返す人はほとんどいないと思います。これは、一般的な考え方を示すための手っ取り早い方法です。
これがすべて達成することになっている限り、ほとんどはデカップリングです。TreeDisplayは、ツリー内のアイテムを表示する方法を知っていますが、ツリー内の個々のオブジェクトに関する詳細を知る必要はありません。逆に、ツリーに表示されているアイテムは、表示がツリーであることについて何も知る必要はありません。代わりに、同じアイテムをフラットリストに表示することを選択した場合、DirectoryBrowser(または他の表示可能なオブジェクト)にはまったく違いはありません。要求されたときに、表示可能なバージョンの関数を関数に送り返す方法を知っている必要があります。
つまり、2つの間のインターフェイスを最小限に抑えたため、どちらも他方に最小限の影響を与えることなく変更でき、どちらかの異なる種類を実装して、他の部分の既存のすべての実装で動作させるのは可能な限り簡単です。
Javaでは、ほとんどのプログラマーはおそらくDisplayableObjectインターフェイス(おそらく別の名前で)を定義し、それを「プラグ」ポイントとして使用して、TreeDisplayがツリー内のオブジェクトと対話できるようにするでしょう。Javaのジェネリックはおそらくこれを行うために使用できますが、C ++でのテンプレートの使用ほど可能性が高いとは思いません(理由はほとんど目前の質問とは関係ありません)。
これは、Javaでのアダプタパターンの追加の例です。そのページの下部にあるサンプルコードは、実装をインターフェイスに簡単に適合させる方法を示しています。LinkedList
Queue
この例は、次の2つのファイルで構成されています。