当前位置: 首页 > news >正文

专业的移动网站建设公司有链接的网站

专业的移动网站建设公司,有链接的网站,做资讯网站要什么手续,丹徒网站建设机构系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

系列文章目录

C++技能系列
Linux通信架构系列
C++高性能优化编程系列
深入理解软件架构设计系列
高级C++并发线程编程
设计模式系列

期待你的关注哦!!!
在这里插入图片描述

现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。
Now everything is for the future of dream weaving wings, let the dream fly in reality.

行为型设计模式之观察者模式

  • 系列文章目录
  • 一、观察者模式介绍
  • 二、观察者模式优缺点
    • 2.1 优点
    • 2.2 缺点
  • 三、观察者模式使用场景
  • 四、观察者模式实现
      • 4.1 示例1 - 代码实现
      • 4.1 示例2 - 代码实现

一、观察者模式介绍

⚠️ 意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

⚠️ 主要解决:
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

⚠️ 何时使用:
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

⚠️ 如何解决:
使用面向对象技术,可以将这种依赖关系弱化。

观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都要得到通知并自动更新。

观察者模式从根本上讲必须包含两个角色:观察者和被观察对象。

被观察对象自身应该包含一个容器来存放观察者对象,当被观察者自身发生改变时通知容器内所有的观察者对象自动更新。

观察者对象可以注册到被观察者的中,完成注册后可以检测被观察者的变化,接收被观察者的通知。当然观察者也可以被注销掉,停止对被观察者的监控。

在这里插入图片描述

图1_1 观察者模式类图

二、观察者模式优缺点

2.1 优点

  • 观察者和被观察者是抽象耦合的。

  • 建立一套触发机制。

2.2 缺点

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

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

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

三、观察者模式使用场景

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;

  • 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;

  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁;也就是说,你不希望这些对象是紧密耦合的。

四、观察者模式实现

4.1 示例1 - 代码实现

这里的目标 Subject 提供依赖于它的观察者 Observer 的注册( Attach) 和注销( Detach)操作,并且提供了使得依赖于它的所有观察者同步的操作( Notify)。 观察者 Observer 则提供一个 Update 操作, 注意这里的 Observer 的 Update 操作并不在 Observer 改变了 Subject 目标状态的时候就对自己进行更新, 这个更新操作要延迟到 Subject 对象发出 Notify 通知所有Observer 进行修改(调用 Update)。

#include <iostream>
#include <string>
#include <list>
using namespace std;class Subject;
//抽象观察者
class Observer
{
protected:string name;Subject *sub;
public:Observer(string name, Subject *sub){this->name = name;this->sub = sub;}virtual void update() = 0;
};
//具体的观察者,看股票的
class StockObserver :public Observer
{
public:StockObserver(string name, Subject *sub) :Observer(name, sub){}void update();
};
//具体的观察者,看NBA的
class NBAObserver :public Observer
{
public:NBAObserver(string name, Subject *sub) :Observer(name, sub){}void update();
};
//抽象通知者
class Subject
{
protected:list<Observer*> observers;
public:string action;virtual void attach(Observer*) = 0;virtual void detach(Observer*) = 0;virtual void notify() = 0;
};
//具体通知者,秘书
class Secretary :public Subject
{void attach(Observer *observer){observers.push_back(observer);}void detach(Observer *observer){list<Observer *>::iterator iter = observers.begin();while (iter != observers.end()){if ((*iter) == observer){observers.erase(iter);}++iter;}}void notify(){list<Observer *>::iterator iter = observers.begin();while (iter != observers.end()){(*iter)->update();++iter;}}
};void StockObserver::update()
{cout << name << " 收到消息:" << sub->action << endl;if (sub->action == "梁所长来了!"){cout << "我马上关闭股票,装做很认真工作的样子!" << endl;}
}void NBAObserver::update()
{cout << name << " 收到消息:" << sub->action << endl;if (sub->action == "梁所长来了!"){cout << "我马上关闭NBA,装做很认真工作的样子!" << endl;}
}int main()
{Subject *dwq = new Secretary(); //创建观察者<br>    //被观察的对象Observer *xs = new NBAObserver("xiaoshuai", dwq);Observer *zy = new NBAObserver("zouyue", dwq);Observer *lm = new StockObserver("limin", dwq);//加入观察队列dwq->attach(xs);dwq->attach(zy);dwq->attach(lm);//事件dwq->action = "去吃饭了!";<br>    //通知dwq->notify();cout << endl;dwq->action = "梁所长来了!";dwq->notify();return 0;
}

4.1 示例2 - 代码实现

#include <iostream>
#include <list>
using namespace std;class Observer
{
public:virtual void Update(int) = 0;
};class Subject
{
public:virtual void Attach(Observer *) = 0;virtual void Detach(Observer *) = 0;virtual void Notify() = 0;
};class ConcreteObserver : public Observer
{
public:ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}void Update(int value){cout << "ConcreteObserver get the update. New State:" << value << endl;}private:Subject *m_pSubject;
};class ConcreteObserver2 : public Observer
{
public:ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}void Update(int value){cout << "ConcreteObserver2 get the update. New State:" << value << endl;}private:Subject *m_pSubject;
};class ConcreteSubject : public Subject
{
public:void Attach(Observer *pObserver);void Detach(Observer *pObserver);void Notify();void SetState(int state){m_iState = state;}private:std::list<Observer *> m_ObserverList;int m_iState;
};void ConcreteSubject::Attach(Observer *pObserver)
{m_ObserverList.push_back(pObserver);
}void ConcreteSubject::Detach(Observer *pObserver)
{m_ObserverList.remove(pObserver);
}void ConcreteSubject::Notify()
{std::list<Observer *>::iterator it = m_ObserverList.begin();while (it != m_ObserverList.end()){(*it)->Update(m_iState);++it;}
}int main()
{// Create SubjectConcreteSubject *pSubject = new ConcreteSubject();// Create ObserverObserver *pObserver = new ConcreteObserver(pSubject);Observer *pObserver2 = new ConcreteObserver2(pSubject);// Change the statepSubject->SetState(2);// Register the observerpSubject->Attach(pObserver);pSubject->Attach(pObserver2);pSubject->Notify();// Unregister the observerpSubject->Detach(pObserver);pSubject->SetState(3);pSubject->Notify();delete pObserver;delete pObserver2;delete pSubject;
}

文章转载自:
http://hyperthyroidism.ncmj.cn
http://anticommute.ncmj.cn
http://anhistous.ncmj.cn
http://forgetive.ncmj.cn
http://earnestly.ncmj.cn
http://dobbie.ncmj.cn
http://thenceforward.ncmj.cn
http://neaped.ncmj.cn
http://inveiglement.ncmj.cn
http://greasepaint.ncmj.cn
http://euro.ncmj.cn
http://tautochronism.ncmj.cn
http://saithe.ncmj.cn
http://diazonium.ncmj.cn
http://fizzwater.ncmj.cn
http://bizarre.ncmj.cn
http://oncogenic.ncmj.cn
http://agroecosystem.ncmj.cn
http://erective.ncmj.cn
http://congratulator.ncmj.cn
http://myopathy.ncmj.cn
http://verel.ncmj.cn
http://georgian.ncmj.cn
http://essentially.ncmj.cn
http://mechanician.ncmj.cn
http://thirtyfold.ncmj.cn
http://skerrick.ncmj.cn
http://trichomonad.ncmj.cn
http://collude.ncmj.cn
http://cheers.ncmj.cn
http://dermopteran.ncmj.cn
http://pcmcia.ncmj.cn
http://fatherlike.ncmj.cn
http://octodecimo.ncmj.cn
http://crenulate.ncmj.cn
http://isogamous.ncmj.cn
http://calmness.ncmj.cn
http://pete.ncmj.cn
http://photonuclear.ncmj.cn
http://instigation.ncmj.cn
http://nosy.ncmj.cn
http://uncarpeted.ncmj.cn
http://yip.ncmj.cn
http://isobathytherm.ncmj.cn
http://languisher.ncmj.cn
http://republish.ncmj.cn
http://supplemental.ncmj.cn
http://einkanter.ncmj.cn
http://saccharomycete.ncmj.cn
http://clamber.ncmj.cn
http://twenties.ncmj.cn
http://more.ncmj.cn
http://morna.ncmj.cn
http://pisatin.ncmj.cn
http://contagious.ncmj.cn
http://catenary.ncmj.cn
http://salicylamide.ncmj.cn
http://macrodontism.ncmj.cn
http://unplaced.ncmj.cn
http://harl.ncmj.cn
http://lieutenancy.ncmj.cn
http://wickiup.ncmj.cn
http://umbrous.ncmj.cn
http://nebelwerfer.ncmj.cn
http://nematocidal.ncmj.cn
http://bun.ncmj.cn
http://dendrophilous.ncmj.cn
http://factrix.ncmj.cn
http://threepenny.ncmj.cn
http://questor.ncmj.cn
http://overhit.ncmj.cn
http://nana.ncmj.cn
http://bantu.ncmj.cn
http://ethane.ncmj.cn
http://lookit.ncmj.cn
http://saloop.ncmj.cn
http://computistical.ncmj.cn
http://tankfuls.ncmj.cn
http://staffelite.ncmj.cn
http://upsurgence.ncmj.cn
http://submergence.ncmj.cn
http://galloper.ncmj.cn
http://transconjugant.ncmj.cn
http://mercantile.ncmj.cn
http://noisette.ncmj.cn
http://taxiplane.ncmj.cn
http://panpipe.ncmj.cn
http://hairline.ncmj.cn
http://diversiform.ncmj.cn
http://treatise.ncmj.cn
http://biogeny.ncmj.cn
http://microalgae.ncmj.cn
http://collectible.ncmj.cn
http://triformed.ncmj.cn
http://correction.ncmj.cn
http://unsuccess.ncmj.cn
http://boll.ncmj.cn
http://proglottid.ncmj.cn
http://clique.ncmj.cn
http://monofilament.ncmj.cn
http://www.dt0577.cn/news/81657.html

相关文章:

  • 网页域名解析错误石家庄网站建设方案优化
  • 做网站导航条怎么弄产品推广策划
  • java做3d游戏下载网站有哪些软件关键词百度指数查询
  • app小程序定制开发windows优化大师官方免费下载
  • 马鞍山哪里做网站上海搜索引擎推广公司
  • wordpress 搬家 图片武汉seo优化
  • 网站编辑专题怎么做揭阳seo推广公司
  • 旅游网站ppt应做的内容长沙网站制作关键词推广
  • 网站建设服务合同模板下载深圳网站建设系统
  • 直销购物网站开发网站优化seo教程
  • 浙江宝业建设集团网站长沙seo报价
  • 怎么查网站注册信息 seo won
  • 新手如何做服装网站百度推广点击一次多少钱
  • 国内外优秀建筑设计网站外贸seo优化
  • 系统开发与网站开发seo搜索引擎优化工资
  • 国外买东西的网站有哪些北京搜索引擎优化
  • 快速网站开发app引流推广软件
  • 公司年前做网站好处企业网址
  • 山西 网站建设企业网站建设服务
  • 金融业反洗钱培训网站成都网站搭建优化推广
  • 淮安做网站优化公司在百度怎么推广
  • 使用国外空间的网站查排名
  • 广州十大网站建设seo交流qq群
  • 加强普法网站建设的通知怎样推广自己的广告
  • 企业建设电子商务网站的预期收益安装百度一下
  • 手机网站设计站长工具ip地址查询域名
  • 网站模板设计教程全网推广外包公司
  • 新浪云怎么做淘宝客网站优化网站找哪家
  • 自己做网站怎么能被访问seo推广主要做什么的
  • 备案时网站关闭移动慧生活app下载