Javaのファサードデザインパターン
1. 前書き
このクイックチュートリアルでは、one of the structural design patterns: the Facadeを見ていきます。
最初に、パターンの概要を示し、その利点をリストし、それが解決する問題について説明します。
次に、ファサードパターンを既存の実用的なJavaの問題に適用します。
2. ファサードとは何ですか?
簡単に言えば、ファサードは単純なインターフェースの背後にある複雑なサブシステムをカプセル化します。 It hides much of the complexity and makes the subsystem easy to use.
また、複雑なサブシステムを直接使用する必要がある場合でも、それを行うことができます。常にファサードを使用する必要はありません。
はるかにシンプルなインターフェースに加えて、このデザインパターンを使用することのもう1つの利点があります。 It decouples a client implementation from the complex subsystem. このおかげで、既存のサブシステムに変更を加えることができ、クライアントに影響を与えることはありません。
ファサードの動作を見てみましょう。
3. Example
車を始動したいとしましょう。 次の図は、レガシーシステムを表しています。
ご覧のとおり、it can be quite complex and does require some effort to start the engine correctly:
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()
ここで必要なのはファサードです。 We’ll hide all the complexity in two methods: startEngine() and stopEngine()。
それを実装する方法を見てみましょう。
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();
}
さて、to start and stop a car, we need only 2 lines of code, instead of 13:
facade.startEngine();
// ...
facade.stopEngine();
4. 欠点
ファサードパターンは、抽象化レイヤーを追加するだけなので、不要なトレードオフを強制することはありません。
単純なシナリオではパターンが過度に使用されることがあり、冗長な実装につながる場合があります。
5. 結論
この記事では、ファサードパターンを説明し、既存のシステム上に実装する方法を示しました。
これらの例の実装は、over on GitHubにあります。