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

国内的优秀网站网站工程是干啥的

国内的优秀网站,网站工程是干啥的,营销自动化平台,数据分析师是干嘛的1. 意图 定义对象间的一种一对多的依赖关系#xff0c; 当一个对象的状态改变时#xff0c;所有依赖于它的对象都得到通知并被自动更新。 2. 四种角色 抽象目标(Subject)、具体目标(Concrete Subject)、抽象观察者(Observer)、 具体观察者(Concrete Observer) 3. 优点 3.1 …1. 意图 定义对象间的一种一对多的依赖关系 当一个对象的状态改变时所有依赖于它的对象都得到通知并被自动更新。 2. 四种角色 抽象目标(Subject)、具体目标(Concrete Subject)、抽象观察者(Observer)、 具体观察者(Concrete Observer) 3. 优点 3.1 目标和观察者之间的耦合是抽象的。 3.2 支持广播通信。 4. 缺点 4.1 可能导致意外的更新。 5. 相关模式 当目标和观察者间的依赖关系特别复杂时需要一个维护这些关系的对象 这样的对象称为ChangeMananger。 5.1 ChangeManager可使用单例模式来保证它是唯一的并且是可全局访问的。 5.2 ChangeManager充当目标和观察者之间的Mediator 6. 代码示意(C) #pragma once #include string #include iostream #include vector using namespace std;class Subject;class Observer { public:virtual void Update(Subject* pSubject) 0; protected:Observer() {} }; class ConcreteObserver :public Observer {string m_state;string m_name; public:ConcreteObserver(const string name) :m_name(name) {}virtual void Update(Subject* pSubject); };class Subject {vectorObserver* m_observers; public:virtual string GetState() 0;virtual void SetState(const string state) 0; public:void Attach(Observer* pObserver) {m_observers.emplace_back(pObserver);cout After attached, observers size is: m_observers.size() endl;}void Detach(Observer* pObserver) {m_observers.erase(std::remove_if(m_observers.begin(), m_observers.end(), [](Observer* p) { return p pObserver; }), m_observers.end());cout After detached, observers size is: m_observers.size() endl;}void Notify(){auto it m_observers.begin();while (it ! m_observers.end()) {(*it)-Update(this);it;}} protected:Subject(){} }; class ConcreteSubject :public Subject {string m_state; public:virtual string GetState() {return m_state;}virtual void SetState(const string state) {m_state state;} }; Observer.cpp: #include Observer.hvoid ConcreteObserver::Update(Subject* pSubject) {m_state pSubject-GetState();cout Observer: m_name ,got state from subject: m_state endl; } #include Observer.h int main() {Subject* pSubject new ConcreteSubject();Observer* pObserver1 new ConcreteObserver(obs1);Observer* pObserver2 new ConcreteObserver(obs2);pSubject-Attach(pObserver1);pSubject-Attach(pObserver2);pSubject-SetState(hello1);pSubject-Notify();pSubject-Detach(pObserver1);pSubject-SetState(hello2);pSubject-Notify();delete pObserver2;delete pObserver1;delete pSubject;return 0; } 运行结果 6.1 目标和观察者之间只知道彼此的抽象类(3.1)。 6.2  Subject::Notify里的循环就是广播观察者自己决定是否处理某一通知(3.2)。 6.3 使用ChangeMananger会使代码复杂些但简化了Subject且使更新策略更加灵活。 使用ChangeMananger代码示意 #pragma once #include string #include iostream #include vector #include map using namespace std;class Subject;class Observer { public:virtual void Update(Subject* pSubject) 0;virtual string GetName() 0; protected:Observer() {} }; class ConcreteObserver :public Observer {string m_state;string m_name; public:ConcreteObserver(const string name) :m_name(name) {}virtual string GetName() { return m_name; }virtual void Update(Subject* pSubject); };class ChangeManager; class SimpleChangeManager;class Subject {ChangeManager* m_pChangeManager; public:virtual string GetState() 0;virtual void SetState(const string state) 0;virtual ~Subject(); public:void Attach(Observer* pObserver);void Detach(Observer* pObserver);void Notify(); protected:Subject(); }; class ConcreteSubject :public Subject {string m_state; public:ConcreteSubject() {}virtual string GetState() {return m_state;}virtual void SetState(const string state) {m_state state;} };class ChangeManager { public:virtual void Register(Subject* pSubject, Observer* pObserver) 0;virtual void Unregister(Subject* pSubject, Observer* pObserver) 0;virtual void Notify() 0; protected:ChangeManager() {} };class SimpleChangeManager :public ChangeManager {mapSubject*, vectorObserver* m_mapSubjects; private:static SimpleChangeManager* s_instance; public:static ChangeManager* Instance() {if (0 s_instance) {s_instance new SimpleChangeManager();}return s_instance;}static void DelInstance() {delete s_instance;s_instance 0;} public:virtual void Register(Subject* pSubject, Observer* pObserver) {vectorObserver* observers m_mapSubjects[pSubject];auto it find(observers.begin(), observers.end(), pObserver);if (it observers.end()) {observers.emplace_back(pObserver);cout pObserver-GetName() is registered successful endl;}else {cout pObserver-GetName() is already registered endl;}}virtual void Unregister(Subject* pSubject, Observer* pObserver) {auto it m_mapSubjects.find(pSubject);if (it m_mapSubjects.end()) {cout No need unregister in map for: pObserver-GetName() endl;}else {vectorObserver* observers m_mapSubjects[pSubject];auto itRemove remove_if(observers.begin(), observers.end(), [](Observer* p) { return p pObserver; });if (itRemove observers.end()) {cout No need unregister in vector for: pObserver-GetName() endl;}else {observers.erase(itRemove, observers.end());cout pObserver-GetName() is unregistered successful endl;if (observers.size() 0) {m_mapSubjects.erase(pSubject);}}}}virtual void Notify() {for (auto pair : m_mapSubjects) {vectorObserver* observers pair.second;auto it observers.begin();while (it ! observers.end()) {(*it)-Update(pair.first);it;}}} protected:SimpleChangeManager() {} }; Observer.cpp: #include Observer.hvoid ConcreteObserver::Update(Subject* pSubject) {m_state pSubject-GetState();cout Observer: m_name ,got state from subject: m_state endl; }Subject::Subject() {m_pChangeManager SimpleChangeManager::Instance(); } Subject::~Subject() {m_pChangeManager 0;SimpleChangeManager::DelInstance(); } void Subject::Attach(Observer* pObserver) {m_pChangeManager-Register(this, pObserver); } void Subject::Detach(Observer* pObserver) {m_pChangeManager-Unregister(this, pObserver); } void Subject::Notify() {m_pChangeManager-Notify(); }SimpleChangeManager* SimpleChangeManager::s_instance 0; #include Observer.h int main() {Subject* pSubject new ConcreteSubject();Observer* pObserver1 new ConcreteObserver(obs1);Observer* pObserver2 new ConcreteObserver(obs2);pSubject-Attach(pObserver1);pSubject-Attach(pObserver2);pSubject-Attach(pObserver1);pSubject-SetState(hello1);pSubject-Notify();pSubject-Detach(pObserver1);pSubject-Detach(pObserver1);pSubject-SetState(hello2);pSubject-Notify();pSubject-Detach(pObserver2);pSubject-Detach(pObserver2);delete pObserver2;delete pObserver1;delete pSubject;return 0; } 运行结果
http://www.pierceye.com/news/230822/

相关文章:

  • 徐州网站建设服务网络营销方式的优点
  • 建设电影网站点击播放是乱页的建站网站多少钱
  • 网站上传服务器教程交做网贷的网站
  • wordpress网站无法打开wordpress怎么设置跳站外链接
  • 宠物美容网站建设的目的延安网站建设
  • 开发网站如何赚钱网站流量攻击软件
  • 达内网站开发视频教程水利建设专项收入在什么网站上申报
  • php网站后台密码忘记了莆田网站建设推广
  • wordpress typo3seo排名优化哪家好
  • 做pc端网站什么开头参考消息网国内新闻
  • 济南网站开发xywlcn宁波公司注册代理公司
  • 网站怎么找的中国外贸出口网站
  • 个人备案网站可以做商城吗做视频点播网站的要求
  • 那个网站点击率高域名解析大全
  • 做优化排名会不会影响网站速度广州网匠营销型网站建设公司
  • 南京林业大学实验与建设网站如何查询网站备案时间查询
  • 做食品网站有哪些凡科建站做的网站收录慢吗
  • 做平面还有什么素材网站集团网站建设
  • seo网站营销推广公司不错的免费网站建设
  • 怎么做自助交易网站平面设计师工资一般多少钱一个月
  • 网站建设如何运营seoul是什么意思
  • 51CTO学院个人网站开发视频营销策划包括哪些内容
  • 专做排名的网站wordpress样式乱了
  • 网站空间域名维护协议网站备案的意义
  • word可以做网站链接吗网站推广的基本方法有哪些
  • 公司展示型网站wordpress后台邮箱怎么设置
  • 小程序咸鱼之王2022年搜索引擎优化指南
  • 企业网站建设 价格wordpress汉化主题
  • 兰州市建设厅官方网站做网站用的编程工具
  • 网站建设及维护招聘周口航迪科技网站建设公司怎么样