《大话设计模式》 -- 13.观察者模式

本文深入探讨了观察者模式的定义、实现及其在解决软件系统中耦合问题的应用。通过具体的类定义和实例,展示了如何利用观察者模式在对象间建立松散耦合关系,确保系统的灵活性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。


//Subject类
class Subject
{
private:
        vector<Observer*> observers;
        
public:
       //增加观察者 
       virtual void Attach(Observer *observer)
       {
            observers.push_back(observer);
       }
       
       //溢出观察者 
       virtual void Detach(Observer *observer)
       {
               observers.erase(observer);
       }
       
       //通知
       virtual void Notify()
       {
               for (size_t i=0; i<observers.size(); ++i)
               {
                   observers[i].Update();
               }
       }          
}; 

class Observer
{
public:
       virtual void Update() = 0;
};

class ConcreteSubject : public Subject
{
private:
        string subjectState;
        
public:
       string GetSubjectState() const{return subjectState;}
       
       void SetSubjectState(string state){subjectState = state;}
};

class ConcreteObserver : public Observer
{
private:
        string name;
        string observerState;
        ConcreteSubject *subject;
        
public:
        ConcreteObserver(ConcreteSubject *subject, string name)
        {
            this->subject = subject;
            this->name = name;
        }
        
        virtual void Update()
        {
              observerState = subject->SubjectState;
              cout << "观察者" << name << "的新状态是" << observerState << endl;
        }        
};

void main()
{
     ConcreteSubject *s = new ConcreteSubject;
      
     s->Attach(new ConcreteObserve(s,"x");
     s->Attach(new ConcreteObserve(s,"Y");
     s->Attach(new ConcreteObserve(s,"Z");
     
     s->SubjectState = "ABC";
     s->Notify();
}

1.将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便

2.何时使用观察者模式:

1.当一个对象的改变需要同时改变其他对象的时候,而且他不知道具体有多少对象有待改变时。

2.一个抽象模型有两个方面,其中一方面依赖于另一方面,这时使用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。

3.观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不会依赖于具体。从而使得各自的变化都不会影响另一边的变化



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值