ActionScript 3 (Flash/AIR): GoF デザインパターン – Facade

複雑なクラス群があって、使用する側が Facade クラスに問い合わせれば窓口となって対応してくれるような、「窓口を作る」設計手法が Facade パターンです。

窓口を作ることで、クラス群側と外を隔て、クラス群を隠ぺいすることができます。

ファサードと読みます。

ActionScript: BookList.as

package jp.feb19.gof.facade
{
	public class BookList
	{
		private var _list:Array
		public function BookList()
		{
			_list = [
				["Action Script 4.0 入門", "パソコンコーナー"],
				["マクロメディアを買う方法", "ビジネスコーナー"],
				["スケベ本", "実用コーナー?"]
			];
		}
		
		public function search(bookname:String):String
		{
			var list:Array = _list;
			var l:uint = list.length;
			for (var i:int = 0; i < l; i++)
			{
				if(bookname === list[i][0])
					return list[i][1];
			}
			return null;
		}
	}
}

ActionScript: LendingList.as

package jp.feb19.gof.facade
{
	public class LendingList
	{
		private var _list:Array;
		
		public function LendingList()
		{
			// 貸し出し中の本一覧
			_list = ["Action Script 4.0 入門"];
		}
		
		public function check(bookname:String):Boolean
		{
			var list:Array = _list;
			var l:uint = list.length;
			for (var i:int = 0; i < l; i++)
			{
				if(bookname === list[i])
					return true;
			}
			return false;
		}
	}
}

ActionScript: BookStoreFacade.as

package jp.feb19.gof.facade
{
	public class BookStoreFacade
	{
		public function BookStoreFacade()
		{
			
		}
		
		public function searchBook(bookname:String):String
		{
			var booklist:BookList = new BookList();
			var location:String = booklist.search(bookname);
			
			if (location != null)
			{
				var lendingList:LendingList = new LendingList();
				if (lendingList.check(bookname))
				{
					// 貸出中
					return bookname + ": 貸出中です";
				}
				else
				{
					// 置いてあるコーナーを返す
					return bookname + ": " + location;
				}
			}
			else
			{
				return bookname + ": そんな本は置いてないよ";
			}
		}
		
	}
}

テストクラス

ActionScript: FacadeTest.as

package jp.feb19.gof.facade
{
	import flash.display.Sprite;
	
	public class FacadeTest extends Sprite
	{
		public function FacadeTest()
		{
			super();
			
			var facade:BookStoreFacade = new BookStoreFacade();
			trace(facade.searchBook("Action Script 4.0 入門"));
			trace(facade.searchBook("スケベ本"));
			trace(facade.searchBook("Adobe 社史"));
		}
	}
}

出力

Action Script 4.0 入門: 貸出中です
スケベ本: 実用コーナー?
Adobe 社史: そんな本は置いてないよ

比較的大規模なクラス群をつくられた経験のある方は API として特別な窓口のクラスを作られたことがあると思いますが、それがこのパターンである、ということのようです。多分。パターンっていうか普通じゃん?と思いますよね。