观察者模式(第四讲)

有一个数据处理类,处理完数据后(什么数据,什么数据都可以),需要通知数据绘制类在界面上绘制数据、数据存储类进行数据的存储。

实现如下:

Class DataDrawer

{

         void Draw();

}

 

Class DataSaver

{

         void Save();

}

 

Class DataProcessor

{

Private:

         DataSaver ds;      

         DataDrawer dd;

Public:

         void Proc();

         void Notify()

{

         ds.Save();

         dd.Draw();

}

}

Change1 : 数据误差处理(在原来的基础上添加一个需求)

则代码实现如下:

Version 1

Class DataErrorController

{

void ErrorControl();

}

Class DataDrawer

{

        void Draw();

}


Class DataSaver

{

        void Save();

}

 

Class DataProcessor

{

Private:

         DataSaver ds;      

         DataDrawer dd;

         DataErrorController dec;    //具体的东西变抽象?        继承

   

Public:

         void Proc();

         void Notify()

{

         dec.ErrorControl();

         ds.Save();

         dd.Draw();

}

}

Change2:  数据输出

则代码实现:在上一份代码的基础上添加一个DataOutputer类,该类中有Outputer方法,在DataProcessor类中声明一个DataOutputer的对象op,并在DataProcessor类的Notify方法中添加op.Outputer();代码

只要添加另外的需求,就会对代码进行如上类似的改动,其中违反了开闭原则,每次我们都对DataProcessor类的内部进行了修改


那么我们该如何对上述代码进行修改,才不会违反我们的原则?

代码实现如下:

Version 2

Class Observer

{

         Abstract void Update();

}

Class DataErrorController : public Observer

{

void ErrorControl();

void Update()

{

         ErrorControl();

}
}

Class DataDrawer:public Observer

{

         void Draw();

void Update()

{

         Draw ();

}

}

 

Class DataSaver:public Observer

{

         void Save();

void Update()

{

         Save ();

}

}

 

Class DataProcessor

{

Private:

         //Observer* ds;

         //Observer* dd;

         //Observer* dec;

         Vector<Observer*> pObs;


Public:

         void Proc();

         void Notify()//通知

{  

  //dec.ErrorControl();

  //ds.Save();

  //dd.Draw();


//接口统一:

  //pObs[0]->ErrorControl();

                  // pObs[1]->Save();

                  // pObs[2]->Draw();           

   

for(int I =0 I <pObs.GetSize(); i++)

         {

                   pObs[i]->Update();

 }

 

//Void Attach();

//void Detach();

void AddObserver(Observer* po)//添加观察者

{

pObs.push(po);
}

void RemoveObserver(int i)//移除观察者

{

         pObs->pop(i);

}

}

}

 

void main()

{

DataProcessor Dp;

DataSaver ds;

DataDrawer dd;

。。。。。。

 

Dp.AddObserver(&ds);

Dp.AddObserver(&dd);


Dp.Notify();

}

Version 1的类图如下:


Version 2 的类图如下:


总结:

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




   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值