1前書き

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

まず、パターンの概要を説明し、その利点を列挙して、それが解決する問題について説明します。

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

** 2ファサードとは

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

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

もっとシンプルなインターフェースの他に、このデザインパターンを使うことのもう一つの利点があります。


複雑なサブシステムからクライアントの実装を切り離します。


これにより、既存のサブシステムに変更を加えることができ、クライアントに影響を与えません。

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

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.まとめ

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

これらの例の実装はhttps://github.com/eugenp/tutorials/tree/master/patterns/design-patterns[GitHubに掲載]をご覧ください。