c ++の例でファサードパターンを説明しますか?
-
05-07-2019 - |
質問
ウィキペディアの記事で確認しましたが、c ++バージョンが欠落しているようですコード例の。これがないと、Facadeパターンを十分に理解できません。C++を使用して説明してください。
解決
ファサードパターン:複雑なサブシステムまたは一連のインターフェイスへの統一された簡略化されたインターフェイスを提供します。クライアントを複雑なサブシステムから同時に切り離す、より高レベルのインターフェースを提供します。
タクシードライバーの理解に役立つ例。タクシードライバー「Take me to PointX」(統一された簡略化された高レベルインターフェイス)に指示し、タスクを実行するために一連のアクション(キーを回す、ギアを変更する、アクセラレーターを押すなど)を開始します。彼は、基礎となるサブシステム(ギアボックス、エンジンなど)の複雑さを抽象化するので、心配する必要はありません。 また、運転手は実際に使用されている車両からあなたを切り離します...あなたは車と直接インターフェースしません。潜在的に彼にMercを渡すこともできますが、ドライバーへのインターフェースはTakeMeTo(X)のままです。特定のモデル/車のメーカーに縛られていません。
実際の例では、サードパーティのコンポーネントまたはライブラリとインターフェイスするファサードがあります。コードを特定のベンダーに依存させたくないので、ファサードインターフェースを導入して分離します。また、このインターフェースを簡素化します。ファサードインターフェースにはSendData(string)というメソッドがありますが、内部的には実装がタスクを完了するために特定の順序でm個のサブパッケージでn個のメソッドを呼び出す場合があります。これは、ウィキペディアページの図に示されています。
e.g。 例をC ++に翻訳し、小さく保つ
sResource = LWCPPSimple::get("http://www.perl.org")
ここで、C ++の架空のライブラリWWWは、問題のプロトコル、ネットワーク、および解析の側面を統合するファサードであるため、リソースを取得することに主眼を置くことができます。 getメソッドは、HTTP、FTP、およびその他のさまざまなプロトコル、要求/応答、接続管理などの複雑さ(および場合によってはugさ)を1か所で隠蔽/カプセル化/保持します。 get()の速度を2倍にする方法により、パフォーマンス上の利点が無料で得られます。クライアントコードを変更する必要はありません。
他のヒント
class Engine
{
public:
void Start() { }
};
class Headlights
{
public:
void TurnOn() { }
};
// That's your facade.
class Car
{
private:
Engine engine;
Headlights headlights;
public:
void TurnIgnitionKeyOn()
{
headlights.TurnOn();
engine.Start();
}
};
int Main(int argc, char *argv[])
{
// Consuming facade.
Car car;
car.TurnIgnitionKeyOn();
return 0;
}
C#の例で検索と置換を行いました。これは役に立たないかもしれません。C++を理解していれば、同じ構造体とキーワード(クラス、関数、名前空間、パブリックなど)を使用しているため、C#を理解できるはずだからです
// "Subsystem ClassA"
#include <iostream>
class SubSystemOne
{
public:
void MethodOne()
{
std::cout << " SubSystemOne Method" << std::endl;
}
}
// Subsystem ClassB"
class SubSystemTwo
{
public:
void MethodTwo()
{
std::cout << " SubSystemTwo Method" << std::endl;
}
}
// Subsystem ClassC"
class SubSystemThree
{
public:
void MethodThree()
{
std::cout << " SubSystemThree Method" << std::endl;
}
}
// Subsystem ClassD"
class SubSystemFour
{
public:
void MethodFour()
{
std::cout << " SubSystemFour Method" << std::endl;
}
}
// "Facade"
class Facade
{
SubSystemOne one;
SubSystemTwo two;
SubSystemThree three;
SubSystemFour four;
public:
Facade()
{
}
void MethodA()
{
std::cout << "\nMethodA() ---- " << std::endl;
one.MethodOne();
two.MethodTwo();
four.MethodFour();
}
void MethodB()
{
std::cout << "\nMethodB() ---- " << std::endl;
two.MethodTwo();
three.MethodThree();
}
}
int Main()
{
Facade facade = new Facade();
facade.MethodA();
facade.MethodB();
return 0;
}
ある意味では、Facadeは、隠された何かと対話したいクライアントのための単なるAPIです。
Fcadeは、C ++で実装されたものや、APIよりも単純に複雑なもののために単純なC APIを公開する場合に役立ちます。または、ライブラリが多数の反復更新を行う必要があり、クライアントにできるだけ影響を与えたくないときに、クライアントとライブラリの間に固定された障壁を得るため。たとえば、Cベースのライブラリを内部でC ++などに更新する必要がある場合、またはまったく異なるものに交換する必要がある場合、Facadeはクライアントにとって適切な中間層です。
class A {
private B b; // Class A uses Class B, the "interface"
public int f() { return b.g(); }
};
class B {
private C c; // class B uses class C, a "subsystem"
private ... ...; // other subsystems can be added
public int g() { c.h(); return c.i(); }
};
class C { // a subsystem
public void h() { ... }
public int i() { return x; }
};
クラスAは、メソッドを直接使用したり、クラスCまたはクラスBに含まれる他のサブシステムの状態に直接影響を与えたりしません。サブシステムがいくつあるかは関係ないため、ここでは1つのサブシステムのみを示しています。