设计模式——观察者模式

一、定义

观察者模式是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。主要解决的问题是,在一个一对多的依赖关系中,当"一"变化的时候,依赖这个"一"的多也能够同步发生改变。

1. 优点

1)观察者和被观察者是抽象耦合的;

2)建立一套触发机制。

2.缺点

1)如果一个被观察者对象有很多的直接和间接的观察者,将所有的观察者都通知到会花费很多时间;

2)如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃;

3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

3.示例

 

#include <iostream>
#include <list>
#include <string>
 
using ::std::list;
using ::std::string;
 
class Observer
{
public:
    Observer() {}
    virtual ~Observer() {}
    virtual void update() {}
};
 
class Subject
{
public:
    Subject(){}
    virtual ~Subject() {}
    void attach(Observer *observer)
    {
        m_observers.push_back(observer);
    }
    void remove(Observer* observer)
    {
        m_observers.remove(observer);
    }
    void notify()
    {
        list<Observer*>::iterator iter = m_observers.begin();
        for(;iter != m_observers.end(); iter++)
            (*iter)->update();
    }
    virtual void setStatus(string s)
    {
        m_status = s;
    }
    virtual std::string getStatus()
    {
        return m_status;
    }
private:
    list<Observer* > m_observers;
protected:
    std::string m_status;
};
 
class ClassSubject: public Subject
{
public:
    ClassSubject(string name):m_name(name) {}
    ~ClassSubject() {}
    void setStatus(string s)
    {
        m_status = s ;
    }
    string getStatus()
    {
        return m_status;
    }
private:
    string m_name;
};
 
class ClassObserver : public Observer
{
public:
    ClassObserver (string name,Subject *subject):m_name(name),m_subject(subject)
    {
    }
    ~ClassObserver () {}
    void update()
    {
        std::string status = m_subject->getStatus();
        cout << m_name  <<"-------" << status <<endl;
    }
private:
    std::string m_name;
    Subject *m_subject;
};

 

 

 

 

#include "observer.h"
int main()
{
    Subject *subject = new ClassSubject("huamoxian");
    Observer *observer = new ClassObserver("hello",subject);
    subject ->attach(observer);
    subject ->setStatus("说话!");
    subject ->notify();
    system("pause");
    delete subject ;
    delete observer;
    return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值