观察者模式(Observer)

个人理解:

观察者模式的核心是Subject的Attach和Detach方法,加载Observer对象


UML类图:

代码实现:

    public abstract class Subject
    {
        protected List<Observer> observers=new List<Observer>();

        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }

        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }

        public void Notify()
        {
            foreach (var o in observers)
                o.Update();
        }
    }

    public abstract class Observer
    {
        public abstract void Update();
    }

    public class SubjectA : Subject
    {
        public int SubjectState { get; set; } //定义这个state只是为了同步更新ObserverA的state
    }

    public class ObserverA : Observer
    {
        public int ObserverState { get; set; }
        private SubjectA subject;

        public ObserverA(SubjectA subject)
        {
            this.subject = subject;
        }

        public override void Update()
        {
            this.ObserverState = this.subject.SubjectState;
            Console.WriteLine("Observer A was notified...");
        }
    }

 

Python代码实现:

class BaseSubject(object):
    __listeners=[]
    def Attach(self, listener):
        self.__listeners.append(listener)
    def Detach(self, listener):
        self.__listeners.remove(listener)
    def Invoke(self):
        for listener in self.__listeners:
            listener.Update()

class AbstractListener(object):
    def Update(self):
        raise NotImplementedError("abstract class")

class AnimalListener(object):
    words=""
    def Update(self):
        print("animal is saying " + self.words)

class PlantListener(object):
    actions=""
    def Update(self):
        print("plant is "+ self.actions +"ing");
if __name__ == "__main__":
    subject=BaseSubject()

    animal1=AnimalListener()
    animal1.words="haha"
    subject.Attach(animal1)

    plant1=PlantListener()
    plant1.actions="laugh"
    subject.Attach(plant1)

    subject.Invoke()


        
        


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值