design pattern——observer

model

implement

target(subject)

typedef string State;
class Observer;

class Target
{
protected:
    Target();
    
public:
    virtual ~Target();
    
public:
    virtual void Attach(Observer* obv);
    virtual void Detach(Observer* obv);
    virtual void Notify();
    
public:
    virtual void SetState(const State& st) = 0;
    virtual State GetState() = 0;
    
private:
    list<Observer*>* _obvs;
};

Target::Target()
{
    _obvs = new list<Observer*>;
}

Target::~Target()
{
}

void Target::Attach(Observer *obv)
{
    _obvs->push_front(obv);
}

void Target::Detach(Observer *obv)
{
    if(obv)
    {
        _obvs->remove(obv);
    }
}

void Target::Notify()
{
    for(list<Observer*>::iterator iter = _obvs->begin(); iter != _obvs->end(); ++iter)
    {
        (*iter)->Update(this);
    }
}

concrete target(concrete subject)

class ConcreteTarget : public Target
{
public:
    ConcreteTarget();
    ~ConcreteTarget();
    
public:
    void SetState(const State& st);
    State GetState();
    
private:
    State _st;
};

ConcreteTarget::ConcreteTarget()
{
    _st = '\0';
}

ConcreteTarget::~ConcreteTarget()
{
}

void ConcreteTarget::SetState(const State& st)
{
    _st = st;
}

State ConcreteTarget::GetState()
{
    return _st;
}

observer

class Observer
{
protected:
    Observer();
    
public:
    virtual ~Observer();
    
public:
    virtual void Update(Target* target) = 0;
    virtual void PrintInfo() = 0;
    
protected:
    State _st;
};

Observer::Observer()
{
    _st = '\0';
}

Observer::~Observer()
{
}

concrete observer

class ConcreteObserverA : public Observer
{
public:
    ConcreteObserverA(Target* target);
    ~ConcreteObserverA();
    
public:
    void Update(Target* target);
    void PrintInfo();
    
public:
    virtual Target* GetTarget();
    
private:
    Target* _target;
};

class ConcreteObserverB : public Observer
{
public:
    ConcreteObserverB(Target* target);
    ~ConcreteObserverB();
    
public:
    void Update(Target* target);
    void PrintInfo();
    
public:
    virtual Target* GetTarget();
    
private:
    Target* _target;
};

ConcreteObserverA::ConcreteObserverA(Target* target)
{
    _target = target;
    _target->Attach(this);
}

ConcreteObserverA::~ConcreteObserverA()
{
    _target->Detach(this);
}

void ConcreteObserverA::Update(Target* target)
{
    _st = target->GetState();
    PrintInfo();
}

void ConcreteObserverA::PrintInfo()
{
    cout << "ConcreteObserverA..." << _target->GetState() <<  endl;
}

Target* ConcreteObserverA::GetTarget()
{
    return _target;
}

ConcreteObserverB::ConcreteObserverB(Target* target)
{
    _target = target;
    _target->Attach(this);
}

ConcreteObserverB::~ConcreteObserverB()
{
    _target->Detach(this);
}

void ConcreteObserverB::Update(Target* target)
{
    _st = target->GetState();
    PrintInfo();
}

void ConcreteObserverB::PrintInfo()
{
    cout << "ConcreteObserverB..." << _target->GetState() <<  endl;
}

Target* ConcreteObserverB::GetTarget()
{
    return _target;
}

应用

void observer_test()
{
    Target* target = new ConcreteTarget();
    
    Observer* obvA = new ConcreteObserverA(target);
    Observer* obvB = new ConcreteObserverB(target);
    
    target->SetState("old");
    target->Notify();
    target->SetState("new");
    target->Notify();
}

总结

  • 抽象:concrete target的基类Target和concrete observer的公共基类Observer进行了抽象
  • 扩展:concrete observer可以进行扩展
  • 开发者不需要知道concrete target和concrete observer,开发者只需要与基类Target和公共基类Observer交互
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值