1. 序章

このクイックチュートリアルでは、構造デザインパターンの1つであるファサードを見ていきます。

最初に、パターンの概要を示し、その利点をリストし、それが解決する問題について説明します。

次に、ファサードパターンをJavaの既存の実用的な問題に適用します。

2. ファサードとは何ですか?

簡単に言えば、ファサードは単純なインターフェイスの背後にある複雑なサブシステムをカプセル化します。 複雑さの多くを隠し、サブシステムを使いやすくします。

また、複雑なサブシステムを直接使用する必要がある場合でも、それを行うことができます。 常にファサードを使用する必要はありません。

はるかにシンプルなインターフェイスに加えて、このデザインパターンを使用することのもう1つの利点があります。 クライアントの実装を複雑なサブシステムから切り離します。 このおかげで、既存のサブシステムに変更を加えることができ、クライアントに影響を与えることはありません。

ファサードの動作を見てみましょう。

3.

車を始動したいとしましょう。 次の図は、これを可能にするレガシーシステムを表しています。

 

ご覧のとおり、非常に複雑になる可能性があり、エンジンを正しく始動するにはある程度の努力が必要です

airFlowController.takeAir()
fuelInjector.on()
fuelInjector.inject()
starter.start()
coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP)
coolingController.run()
catalyticConverter.on()

同様に、エンジンを停止するには、かなりの数の手順が必要です。

fuelInjector.off()
catalyticConverter.off()
coolingController.cool(MAX_ALLOWED_TEMP)
coolingController.stop()
airFlowController.off()

ここで必要なのはファサードです。 startEngine()とstopEngine()の2つのメソッドですべての複雑さを隠します。

それを実装する方法を見てみましょう。

public class CarEngineFacade {
    private static int DEFAULT_COOLING_TEMP = 90;
    private static int MAX_ALLOWED_TEMP = 50;
    private FuelInjector fuelInjector = new FuelInjector();
    private AirFlowController airFlowController = new AirFlowController();
    private Starter starter = new Starter();
    private CoolingController coolingController = new CoolingController();
    private CatalyticConverter catalyticConverter = new CatalyticConverter();

    public void startEngine() {
        fuelInjector.on();
        airFlowController.takeAir();
        fuelInjector.on();
        fuelInjector.inject();
        starter.start();
        coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP);
        coolingController.run();
        catalyticConverter.on();
    }

    public void stopEngine() {
        fuelInjector.off();
        catalyticConverter.off();
        coolingController.cool(MAX_ALLOWED_TEMP);
        coolingController.stop();
        airFlowController.off();
    }

さて、車を始動および停止するには、13:ではなく、2行のコードのみが必要です。

facade.startEngine();
// ...
facade.stopEngine();

4. 欠点

ファサードパターンは、抽象化レイヤーを追加するだけなので、不要なトレードオフを強制することはありません。

単純なシナリオではパターンが使いすぎて、実装が冗長になる場合があります。

5. 結論

この記事では、ファサードパターンについて説明し、既存のシステムの上にそれを実装する方法を示しました。

これらの例の実装は、GitHubにあります。