Observer模式

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.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值