class Observer { private function Observer(){} // Methods public function Update():Void{}; } class Subject { // Fields private var observers:Array = new Array(); private function Subject() { } // Methods public function Attach(observer:Observer):Void { observers.push(observer); } public function Detach(observer:Observer):Void { observers.shift(observer); } public function Notify():Void { //trace(observers); for (var i=0; i < observers.length; i++) { observers[i].Update(); } } } class ConcreteObserver extends Observer { // Fields private var name:String; private var observerState:String; private var subject:ConcreteSubject; // Constructors public function ConcreteObserver(sub:ConcreteSubject, n:String) { subject = sub; name = n; //trace(subject+":"+n); } // Methods public function Update():Void { //trace(subject.SubjectState); observerState = subject.SubjectState; trace("Observer " + name + "'s new state is " + observerState); } // Properties public function get Subject():ConcreteSubject { return subject; } public function set Subject(value:ConcreteSubject):Void { subject = value; } } class ConcreteSubject extends Subject { // Fields private var subjectState:String; public function get SubjectState():String { return subjectState; } public function set SubjectState(value:String):Void { subjectState=value; } } //client.fla var s:ConcreteSubject = new ConcreteSubject(); s.Attach(new ConcreteObserver(s, "X")); s.Attach(new ConcreteObserver(s, "Y")); s.Attach(new ConcreteObserver(s, "Z")); // Change subject and notify observers s.SubjectState = "ABC"; s.Notify(); //output: //Observer X's new state is ABC //Observer Y's new state is ABC //Observer Z's new state is ABC 这个模式太重要了,MVC经常用到! 一般是监视View的动作,通过Control改变Model.
Observer模式
最新推荐文章于 2025-03-22 14:06:14 发布