[设计模式as3版]二.观察者模式

16 篇文章 0 订阅
5 篇文章 0 订阅
发布者
package 
{
	public interface Subject {
		
		function addObserver(observer:Observer):void;
		function removeObserver(observer:Observer):void;
		function notifyObservers():void;
		
	}
}


观察者

package 
{
	public interface Observer {
		
		function update(data:Object=null):void;
	}
}

发布者具体实现类

package 
{	
	public class TimeData implements Subject {
		
		private var _now:Date;
		
		private var observers:Vector.<Observer>;
		
		public function TimeData() {
			observers = new Vector.<Observer>();	
		}
		
		public function addObserver(observer:Observer):void {
			observers.push(observer);	
		}
		
		public function removeObserver(observer:Observer):void {
			var index:int = observers.indexOf(observer);
			if(index >= 0) {
				observers.splice(index, 1);	
			}
		} 
		
		public function notifyObservers():void {
			for each (var observer:Observer in observers) {
				observer.update(_now);
			}
		}

		public function get now():Date {
			return _now;
		}

		public function set now(value:Date):void {
			_now = value;
			notifyObservers();
		}
	}
}

观察者具体实现类

package
{
	import flash.display.Shape;
	
	public class GraphicDisplay extends Shape implements Observer {
		
		private var _subject:Subject;
		
		public function GraphicDisplay() {
			
		}
		
		public function set subject(value:Subject):void {
			if(_subject) {
				_subject.removeObserver(this);	
			}
			_subject = value;
			if(_subject) {
				_subject.addObserver(this);	
			}
		}
		
		public function update(data:Object=null):void {
			var now:Date = data as Date;
			if(now) {
				var width:Number = now.seconds * 5;
				graphics.clear();
				graphics.beginFill(0x000088);
				graphics.drawRect(0, 0, width, 5);
				graphics.endFill();
			}
		}
	}
}



观察者具体实现类

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	
	public class TextDisplay extends Sprite implements Observer {
		
		private var _subject:Subject;
		private var text:TextField;
		
		public function TextDisplay() {
			text = new TextField();
			text.text = "当前时间:00:00:00";
			addChild(text);
		}
		
		public function set subject(value:Subject):void {
			if(_subject) {
				_subject.removeObserver(this);	
			}
			_subject = value;
			if(_subject) {
				_subject.addObserver(this);	
			}
		}
		
		public function update(data:Object=null):void {
			var now:Date = data as Date;
			if(now) {
				var str:String = "当前时间:";
				str += (now.hours >= 10   ? now.hours   : "0" + now.hours);
				str += ":";
				str += (now.minutes >= 10 ? now.minutes : "0" + now.minutes);
				str += ":";
				str += (now.seconds >= 10 ? now.seconds : "0" + now.seconds);
				text.text = str;
			}
		}
	}
}



测试类

package 
{
	import flash.display.Sprite;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	
	[SWF(width="500", height="400")]
	public class ObserverTest extends Sprite {
		
		private var timeData:TimeData;
		private var graphicDisplay:GraphicDisplay;
		private var textDisplay:TextDisplay;
		
		public function ObserverTest() {
			timeData = new TimeData();
			textDisplay = new TextDisplay();
			textDisplay.subject = timeData;
			addChild(textDisplay);
			textDisplay.y = 10;
			graphicDisplay = new GraphicDisplay();
			graphicDisplay.subject = timeData;
			addChild(graphicDisplay);
			graphicDisplay.y = 40;
			
			var timer:Timer = new Timer(1000);
			timer.addEventListener(TimerEvent.TIMER, onTimer);
			timer.start();
		}
		
		private function onTimer(event:TimerEvent):void {
			timeData.now = new Date();	
		}
		
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值