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

インスタンスは必要になってから作るようにする事で無駄をなくす事を目指したパターンです。

あるクラスのふりをした別のクラスが先にメソッドを受け取って、加工して、本来のクラスに渡すようにします。

クラス構造とか見てると普通にポリモーフィズムしてるだけじゃん?とか思ったりもしますが、 Flash の Loader がこのパターンに該当していて、 load する前に addChiild できるところとかこんな感じらしいです。

ActionScript: ISecurity.as

package jp.feb19.gof.proxy
{
	public interface ISecurity
	{
		function login():void;
	}
}

ActionScript: ProxyLogin.as

package jp.feb19.gof.proxy
{
	public class ProxyLogin implements ISecurity
	{
		private var _username:String;
		private var _loggedIn:ISecurity;
		
		public function ProxyLogin(username:String)
		{
			_username = username;
		}
		
		public function login():void
		{
			if (_loggedIn == null)
			{
				_loggedIn = new RealLogin(_username);
			}
			_loggedIn.login();
		}
	}
}

ActionScript: RealLogin.as

package jp.feb19.gof.proxy
{
	public class RealLogin implements ISecurity
	{
		private var _username:String;
		
		public function RealLogin(username:String)
		{
			_username = username;
			
			trace(_username + " をログインします");
		}
		
		public function login():void
		{
			trace("ログイン済み: " + _username);
		}
	}
}

テストクラス

ActionScript: ProxyTest.as

package jp.feb19.gof.proxy
{
	import flash.display.Sprite;
	
	public class ProxyTest extends Sprite
	{
		public function ProxyTest()
		{
			super();
			
			var user1:ISecurity = new ProxyLogin("user1");
			var user2:ISecurity = new ProxyLogin("user2");
			var user3:ISecurity = new ProxyLogin("user3");
			
			user1.login();
			user2.login();
			user2.login();
			user3.login();
			user2.login();
			
		}
	}
}

出力

user1 をログインします
ログイン済み: user1
user2 をログインします
ログイン済み: user2
ログイン済み: user2
user3 をログインします
ログイン済み: user3
ログイン済み: user2

正直あんまりよくわかりませんでした。インターフェースでプログラミングして隠蔽するって言う事なんだと思います。別のパターンでもそういうことだし。