Javaデザインパターン 共通の入り口を作る「Facade」
デザインパターンのうち、Facadeパターンについて紹介します。
Facadeパターンとは
GoF本の定義によると、Facadeパターンは以下のような目的で使われるとされています。
サブシステム内に素な持している複数のインターフェース群に対する、統一したインターフェースを提供する。
Facadeぱ高レベルのインターフェースを定義することにより、サブシステムを容易に使えるようにするものである。
言い方が難しいので、簡単に言い直すと、Facadeパターンは既存システムの使用方法を簡単にするために使います。
Facadeは窓口という意味がありますが、窓口を用意することによって、既存のシステムへの入り口を簡素にします。
実は、Facadeパターンは実生活でもお目にかかることがあります。
たとえば、大きな会社だったら「社内ヘルプデスク」みたいな部署があったりしませんか?
会社のPCの故障や、申請事項などをまとめてやってくれる部署です。
複雑な申請事項などを意識せずとも、ヘルプデスクという「窓口」の使い方だけ知っていれば、それで目的は果たせます。
実際にサンプルを見てみます。
クラス図
クラス図はこんな感じです。
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です。
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (399件) を見る
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本
- 作者: Eric Freeman,Elisabeth Freeman,Kathy Sierra,Bert Bates,佐藤直生,木下哲也,有限会社福龍興業
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/12/02
- メディア: 大型本
- 購入: 14人 クリック: 362回
- この商品を含むブログ (94件) を見る