设计模式——观察模式

  观察者模式

   网上商店形式多样,每个站点有自己的特色,但也有其一般的共性,单就"商品的变化,以便及时通知订户"这一点,是很多网上商店共有的模式,这一模式类似Observer patern观察者模式.

具体的说,如果网上商店中商品在名称 价格等方面有变化,如果系统能自动通知会员,将是网上商店区别传统商店的一大特色.这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update动作.

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

 

#include <string>

#include <iostream>

#include <vector>

using namespace std;

 

class Inform;

//各商店类(观察对象,观察者)

class MarketObserver

{

private:

       string name;

       Inform* sub;

public:

       MarketObserver(string strname,Inform* strsub)

       {

              name=strname;

              sub=strsub;

       }

       void Update();

};

//通知类(主题对象,通知者)

class Inform

{

private:

       vector<MarketObserver> observers;

public:

       string action;

       void Add(MarketObserver ob)

       {

              observers.push_back(ob);

       }

       void Notify()

       {

        vector<MarketObserver>::iterator p = observers.begin();

              while (p!=observers.end())

              {

                     (*p).Update();

                     p++;

              }

       }

};

 

void MarketObserver::Update()

{

       cout<<name<<":"<<sub->action<<"发生变化了"<<endl;

}

 

//客户端

int main()

{

    Inform *p=new Inform();  //创建通知者

 

       //观察者

       MarketObserver *s1= new MarketObserver("甲商店",p);

       MarketObserver *s2 = new MarketObserver("乙商店",p);

    //加入通知队列

       p->Add(*s1);

       p->Add(*s2);

    //事件

       p->action="名称";

       //通知

       p->Notify();

       return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值