设计模式-观察者模式

观察者模式是松耦合,对象通过抽象接口像观察者发送信息。当对象发生变化时,所有的观察者都能收到对应的信息。这一点和发布-订阅模式很像,但又不同。发布-订阅是完全不耦合的,发布者和订阅者双方都不知道对方的信息,双方通过第三者消息队列进行交流信息。
在这里插入图片描述

Observer: 观察者抽象接口,所有观察者都要继承该类。
ConcreteObserver: 具体的观察者,获取观察对象的状态变化。
Subject: 观察对象的抽象接口。
ConcreteSubject:具体的对象,对所有观察者进行记录,等到自己的状态发生变化时,及时通知所有观察者把自己的状态变化及时通知所有观察者。

下面是代码示例

class Observer
{
    public:
        virtual void Update(int nstate) = 0;  //当观察对象状态更新时会调用该函数
		virtual ~Observer();
};

class ConcreteObserver : public Observer
{
    public:
	
	    void Update(int nstate)
	    {
            std::cout<<"State:"<<"观察的对象状态变成"<<"nstate"<<endl;
	    }
		
};

class Subject
{
    public:
        virtual void Attach(Observer* pOberver) = 0;
		virtual void Detach(Observer* pOberver) = 0;
		virtual void Notify(int n) = 0;
};

class ConcreteSubject
{
    private:
	      List<Observer*> m_subject;
    public:
       void Attach(Observer* pOberver)
       {
	       m_subject.push_back(pOberver)
	   }
       void Detach(Observer* pOberver)
       {
	       delete pOberver;
		   m_subject.remove(pOberver);
	   }
       void Notify()
	   {
	       for(auto iter = m_subject.bengin(); iter!= m_subject.end(); iter++)
		   {
		       (*iter)->Update(n);
		   }
       }   
};

测试代码

void test()
{
    Subject* sSub1 = new ConcreteSubject();
	Observer* sObser1 = new ConcreteObserver();
	Observer* sObser2 = new ConcreteObserver();
	sSub1->Attach(sObser1)
	sSub1->Attach(sObser2)
	sSub1->Notify(5);
	delete sSub1;
	delete sObser1;
	delete sObser2;
}
int main()
{
    test();
    retuen 0;
}

通过继承Observer ,可以很方便的扩展新的观察者,在Update中可以重写,实现新的功能,这样之前与对象相关的代码无需改动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值