Facade パターン (複数のサブシステムの統一窓口となる高レベルなインタフェースを提供する)

[Facade] という英単語は, [建物の正面] を意味する.

このパターンは, 複雑な内部処理 (データベース処理, 業務処理 etc) を隠蔽し, 利用者にシンプルなインタフェースを提供するパターンである.

また, 複雑な API 呼び出しの適切な実行順を利用者に意識させないという目的もある.

役割

  1. Facade (正面):
複雑な処理を構成している Class[A,B,C,D] のシンプルなインタフェースを提供する. 各々オブジェクトのメソッドを適切な順番, 使い方で呼び出す.
  1. Class[A,B,C,D] (各処理):
各々が担当している処理を行う. [Facade] から呼び出されて処理を行うが, その事を意識しないし, 逆に [Facade] を呼び出すこともしない.
  1. Client (依頼者):
[Facade] が提供するメソッドを呼び出し処理を行う.

クラス図

Facade パターンのクラス図

_images/designpattern-facade012.gif

ソースコード

  1. Facade.java
1
2
3
4
5
6
7
8
public class Facade{
    public void facadeMethod(){
	( new ClassA() ).methodA();
	( new ClassB() ).methodB();
	( new ClassC() ).methodC();
	( new ClassD() ).methodD();
    }
}

2-1. ClassA.java

1
2
3
4
5
public class ClassA{
    public void methodA(){
	System.out.println("ClassA-mA()");
    }
}

2-2. ClassB.java

1
2
3
4
5
public class ClassB{
    public void methodB(){
	System.out.println("ClassB-mB()");
    }
}

2-3. ClassC.java

1
2
3
4
5
public class ClassC{
    public void methodC(){
	System.out.println("ClassC-mC()");
    }
}

2-4. Facade.java

1
2
3
4
5
public class ClassD{
    public void methodD(){
	System.out.println("ClassD-mD()");
    }
}
  1. Client.java
1
2
3
4
5
6
public class Client{
    public static void main(String[] args){
	Facade facade = new Facade();
	facade.facadeMethod();
    }
}

上記のプログラムの実行結果:

[wtopia Facade]$ java Client
ClassA-mA()
ClassB-mB()
ClassC-mC()
ClassD-mD()