Bridgeパターンとは、機能の拡張と実装を分けて独立させることで、柔軟に機能を拡張できるデザインパターンだ。これにより、異なる実装を簡単に切り替えることができる。
たとえば、ゲームで「キャラクター」と「武器」の組み合わせを自由に変更したい場合、このパターンを使うと便利だ。
では、サンプルコードを一緒に見ていこう。
Bridgeパターンの基本的な考え方は、「機能」と「実装」を分けることにある。ここでは、異なる描画エンジン(例えば、モニター用とプリンター用)を扱う例を考えよう。まず、描画エンジンのインターフェイスを作り、その後、実際の描画エンジンを作成する。
// 描画エンジンのインターフェイス
class DrawingEngine {
drawLine() {
throw new Error("このメソッドはサブクラスで実装される必要があります");
}
drawCircle() {
throw new Error("このメソッドはサブクラスで実装される必要があります");
}
}
// モニター用描画エンジン
class MonitorEngine extends DrawingEngine {
drawLine() {
console.log("モニターに線を描画しています");
}
drawCircle() {
console.log("モニターに円を描画しています");
}
}
// プリンター用描画エンジン
class PrinterEngine extends DrawingEngine {
drawLine() {
console.log("プリンターで線を印刷しています");
}
drawCircle() {
console.log("プリンターで円を印刷しています");
}
次に、図形(例えば、線や円)を作成し、それらが描画エンジンを使って描かれるようにする。図形クラスには、描画エンジンが注入され、描画方法を選択できるようにする。
// 図形クラス
class Shape {
constructor(engine) {
this.engine = engine;
}
draw() {
throw new Error("このメソッドはサブクラスで実装される必要があります");
}
}
// 線クラス
class Line extends Shape {
draw() {
this.engine.drawLine();
}
}
// 円クラス
class Circle extends Shape {
draw() {
this.engine.drawCircle();
}
}
最後に、Bridgeパターンを使って、同じ図形でも異なる描画エンジンで描画できることを確認してみよう。例えば、モニターで円を描画したり、プリンターで線を描画することができる。
// モニターで描画
const monitorEngine = new MonitorEngine();
const circleOnMonitor = new Circle(monitorEngine);
circleOnMonitor.draw(); // モニターに円を描画しています
// プリンターで描画
const printerEngine = new PrinterEngine();
const lineOnPrinter = new Line(printerEngine);
lineOnPrinter.draw(); // プリンターで線を印刷しています
これでBridgeパターンの解説は終わりだ。
このパターンを使うと、機能の追加や変更を柔軟に行えるため、複雑なシステムでの拡張に非常に役立つ。