Javaデザインパターン 共通の入り口を作る「Facade」


スポンサーリンク

デザインパターンのうち、Facadeパターンについて紹介します。

Facadeパターンとは

GoF本の定義によると、Facadeパターンは以下のような目的で使われるとされています。

サブシステム内に素な持している複数のインターフェース群に対する、統一したインターフェースを提供する。
Facadeぱ高レベルのインターフェースを定義することにより、サブシステムを容易に使えるようにするものである。

言い方が難しいので、簡単に言い直すと、Facadeパターンは既存システムの使用方法を簡単にするために使います。

Facadeは窓口という意味がありますが、窓口を用意することによって、既存のシステムへの入り口を簡素にします。

実は、Facadeパターンは実生活でもお目にかかることがあります。

たとえば、大きな会社だったら「社内ヘルプデスク」みたいな部署があったりしませんか?
会社のPCの故障や、申請事項などをまとめてやってくれる部署です。

複雑な申請事項などを意識せずとも、ヘルプデスクという「窓口」の使い方だけ知っていれば、それで目的は果たせます。
実際にサンプルを見てみます。


クラス図

クラス図はこんな感じです。

f:id:sho322:20141026122034j:plain

Mainは、HelpDeskのインターフェースだけ知っていれば、あとはHelpDeskの方で社員の検索処理などをやって、結果を返してくれます。


サンプル

■プロパティファイル(社員とメールアドレスを格納しているDBの代わり)
shainList.txt

saruta=hoge@shigetomi.com
hazuki=fuga@shigetomi.com
yuka=foo@shigetomi.com

■Dao

package facade;

import java.util.Map;

public interface Dao {
	public Map getShainMap();
}

■ShainDao

package facade;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

public class ShainDao implements Dao {

	private final String SHAIN_LIST = "shainList.txt";
	@Override
	public Map getShainMap() {
		Map<Object, Object> shainMap = new HashMap();
		Properties prop = new Properties();

		try {
			prop.load(new FileInputStream(SHAIN_LIST));
		} catch (IOException e) {
			e.printStackTrace();
		}

		for(Entry<Object,Object> e : prop.entrySet()) {
			shainMap.put(e.getKey(), e.getValue());
		}
		return shainMap;
	}

}

■HelpDesk

package facade;

public interface HelpDesk {
	/**
	 * 名前を引数に、社員のメールアドレスを返します。
	 * @param shainName
	 * @return 社員のメールアドレス
	 */
	public String getShainMailAddress(String shainName);
}


■HelpDeskImpl

package facade;

import java.util.Iterator;
import java.util.Map;

public class HelpDeskImpl implements HelpDesk {

	@Override
	public String getShainMailAddress(String shainName) {

		String mailAddress = null;
		Dao dao = new ShainDao();
		Map map = dao.getShainMap();



		Iterator ite = map.entrySet().iterator();

		while (ite.hasNext()) {
			Map.Entry pairs = (Map.Entry)ite.next();
			String name = (String) pairs.getKey();

			if (name.equals(shainName)) {
				mailAddress = (String) pairs.getValue();
			}

			ite.remove(); //ConcurrentModificationExceptionを避けるため
		}
		return mailAddress;
	}

}

■Main

package facade;

public class Main {
	public static void main(String[] args) {
		HelpDesk help = new HelpDeskImpl();
		String name = "saruta";
		String mail = null;

		mail = help.getShainMailAddress(name);

		if (mail != null) {
			System.out.println(name + "さんのメールアドレスは、" + mail + "です。");
		} else {
			System.out.println(name + "という社員は存在しません。");
		}
	}
}

実行した結果は以下のとおりになります。

sarutaさんのメールアドレスは、hoge@shigetomi.comです。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

  • 作者: Eric Freeman,Elisabeth Freeman,Kathy Sierra,Bert Bates,佐藤直生,木下哲也,有限会社福龍興業
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2005/12/02
  • メディア: 大型本
  • 購入: 14人 クリック: 362回
  • この商品を含むブログ (94件) を見る