发布者
发布者具体实现类
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();
}
}
}