当前位置: 首页 > 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://www.fp688.cn/news/392.html

相关文章:

  • 网站建设能在家工作室/电商运营基础知识
  • 家居网站建设 百度文库/爱站网长尾关键词挖掘
  • ps ui做响应式网站要求/seo研究中心好客站
  • 云南网站定制/网站关键词推广价格
  • 外地公司做的网站能备案吗/seo资源网站 排名
  • 宁国新站seo/互联网论坛
  • 网站建设策划方案书论文/营销宝
  • 深圳发型网站建设/百度点击软件还有用吗
  • 做淘客的网站关键词有哪些/优化seo软件
  • 外贸 需要到国外建网站吗/p站关键词排名
  • 网站要咋做/廊坊seo推广
  • 济宁网站开发平台/seo链接优化
  • 秦皇岛开发区建设局网站/安卓在线视频嗅探app
  • 哪些网站免费做职业测评/怎么建立企业网站
  • 网站注册域名后怎么做/网站访问量统计工具
  • 小木桥建设网站/营销策划精准营销
  • asp网站建设公司/西安seo优化
  • 信用中国 网站 支持建设/搜索词热度查询
  • 小型门户网站建设硬件配置/媒体资源网官网
  • 拉萨工商做年检网站/蚂蚁链接bt链接
  • 个人做的网站可以收款/seo网站优化建议
  • 工商局网站怎么做股东实名认证/济南seo整站优化价格
  • 江西省楚天建设集团有限公司网站/it培训四个月骗局
  • 网页设计图片高清/seo刷关键词排名工具
  • php网站开发实例教程第九章/2345浏览器官网
  • 大良o2o网站建设/创建网站的公司
  • wordpress源码带数据/图片seo优化是什么意思
  • vs建设网站/百度谷歌seo优化
  • 网络教育网站如何做营销推广/seo优化sem推广
  • 跟有流量的网站做友情链接/seo排名赚靠谱吗