実生活でもソフトウェア開発プロセスでも、人々はこのような状況に遭遇することがよくあります。たとえば、ユーザーが自分のコンピューターを組み立てるとき、モニター、マザーボード、ハードディスクなどのハードウェアを購入する必要があるなど、複数のオブジェクトを処理する必要があります。メモリ、CPU などの機器、組み立て工程は面倒で、機器の互換性がない可能性がありますが、専門家によって組み立てられたコンピュータを直接購入することで、これらのトラブルを回避できます。機器を購入する必要はなく、プロのコンピューター組み立て業者を通じて完全なコンピューターを入手できます。コンピューター アセンブラーの出現により、ユーザーと複数のデバイス間の対話が単純化され、ユーザーがデバイスのアセンブリの詳細を気にせずにそれらを使用できるようになりました. ここで、コンピューター アセンブラーは、私たちが A ロールと呼ぶ「ファサード クラス」として機能します。これにより、ユーザーと複数のオブジェクト間の対話プロセスが簡素化されます。この設計思想に基づくパターンを「外観パターン」と呼びます。
思考定義: サブシステム内の一連のインターフェイスに統一されたエントリを提供するために、エクステリア モードは、サブシステムを使いやすくする高レベル インターフェイスを定義します。サブシステムとの外部通信は、統一されたファサード オブジェクトを介して行うことができます
利点:
- クライアントからサブシステム コンポーネントを保護し、クライアントが処理するオブジェクトの数を減らし、サブシステムを使いやすくします。
- サブシステムとクライアント間の疎結合関係が実現されます
短所:
- 顧客はサブシステム クラスの使用を十分に制限することができず、制限が厳しすぎると変動性と柔軟性が低下します。
- 新しいサブシステムを追加するには、外観クラスまたはクライアントのコードを変更する必要がある場合があり、これは「オープンとクローズの原則」に違反します。
該当するシナリオ:
- 複雑なサブシステムに単純なインターフェイスを提供する場合は、ファサード パターンを使用します。
ケース: ホーム シアター アピアランス モードのアプリケーションを実現 (各製品がオンとオフの操作を提供)
KTV モードを実現: TV オン、ライト オフ、オーディオ オン、マイク オン、DVD オン
コードの実装:
各製品がオンとオフの方法を提供
//电视类
class Television
{
public:
void On()
{
cout << "电视打开" << endl;
}
void Off()
{
cout << "电视关闭" << endl;
}
};
//灯类
class Light
{
public:
void On()
{
cout << "灯打开" << endl;
}
void Off()
{
cout << "灯关闭" << endl;
}
};
//音响类
class Audio
{
public:
void On()
{
cout << "音响打开" << endl;
}
void Off()
{
cout << "音响关闭" << endl;
}
};
//麦克风类
class Microphone
{
public:
void On()
{
cout << "麦克风打开" << endl;
}
void Off()
{
cout << "麦克风关闭" << endl;
}
};
//dvd类
class DvdPlayer
{
public:
void On()
{
cout << "DVD打开" << endl;
}
void Off()
{
cout << "DVD关闭" << endl;
}
};
ファサード オブジェクトで、組織の製品の機能を管理する
class KTVMode
{
public:
KTVMode()
{
pTv = new Television;
pLight = new Light;
pAudio = new Audio;
pMicrophone = new Microphone;
pDvd = new DvdPlayer;
}
~KTVMode()
{
delete pTv;
delete pLight;
delete pAudio;
delete pMicrophone;
delete pDvd;
}
//打开ktv
void OnKty()
{
pTv->On();
pLight->Off();
pAudio->On();
pMicrophone->On();
pDvd->On();
}
//关闭ktv
void OffKty()
{
pTv->Off();
pLight->On();
pAudio->Off();
pMicrophone->Off();
pDvd->Off();
}
private:
Television* pTv;
Light* pLight;
Audio* pAudio;
Microphone* pMicrophone;
DvdPlayer* pDvd;
};
スクリーンショットを実行します。