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

委譲を利用して、処理と機能を分離し、階層分けして、クラスを効率的に増やしていけるようにするパターンです。

Windows と Mac と Linux を対象にしたユーザーインターフェースを実装するとき、同じ処理でもアルゴリズムや見た目を変えたいときに、普通に実装してしまうと WindowsButton.as WindowsTextField.as … となってしまいますが、Windows.as と Button.as を分けて考えられるようにする事で処理と機能を分ける、みたいな考え方です。

wikipedia の説明が分かりやすいです。
それをそのまま実装してみました。

ActionScript: Material.as

package jp.feb19.gof.bridge
{
	public class Material
	{
		public function Material()
		{
		}
	}
}

ActionScript: Dishware.as

package jp.feb19.gof.bridge
{
	public class Dishware
	{
		private var _material:Material;
		public function Dishware(material:Material)
		{
			_material = material;
		}

		public function get material():Material
		{
			return _material;
		}
	}
}

Material のサブクラス

ActionScript: Wood.as

package jp.feb19.gof.bridge
{
	public class Wood extends Material
	{
		public function Wood()
		{
			super();
		}
	}
}

ActionScript: Glass.as

package jp.feb19.gof.bridge
{
	public class Glass extends Material
	{
		public function Glass()
		{
			super();
		}
	}
}

Dishware サブクラス

ActionScript: Plate.as

package jp.feb19.gof.bridge
{
	public class Plate extends Dishware
	{
		public function Plate(material:Material)
		{
			super(material);
		}
		
		public function toString():String
		{
			return this.material + " plate";
		}
	}
}

ActionScript: Bowl.as

package jp.feb19.gof.bridge
{
	public class Bowl extends Dishware
	{
		public function Bowl(material:Material)
		{
			super(material);
		}
		
		public function toString():String
		{
			return this.material + " bowl";
		}
	}
}

テストクラス

ActionScript: BridgeTest.as

package jp.feb19.gof.bridge
{
	import flash.display.Sprite;
	
	public class BridgeTest extends Sprite
	{
		public function BridgeTest()
		{
			super();
			
			var bowl:Bowl = new Bowl(new Glass());
			trace(bowl);
		}
	}
}

出力

[object Glass] bowl