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

网站怎么做才 吸引人手工制作大全 简单易学

网站怎么做才 吸引人,手工制作大全 简单易学,网站做推广百度好还是360好,北京理工大学网站网页设计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.w-s-a.com/news/447260/

相关文章:

  • 网站关键词密度怎么计算的中文版wordpress
  • asp网站建设教程如何在线上推广自己的产品
  • 电脑网站你懂我意思正能量济南网站建设公司熊掌号
  • 杂志社网站建设萧山区网站建设
  • 电商网站前端制作分工网站怎做百度代码统计
  • 免费的html大作业网站网站开发心得500字
  • 临时工找工作网站做美缝帮别人做非法网站
  • 深圳网站建设 设计创公司新昌网站开发
  • 唐山教育平台网站建设上海装修网官网
  • 一个公司做多个网站什么行业愿意做网站
  • 成都龙泉建设网站免费域名app官方下载
  • xss网站怎么搭建如何用wordpress站群
  • 怎样做网站外链supercell账号注册网站
  • 阿里巴巴网站是用什么技术做的哪些网站做推广比较好
  • 做网站go和python手机如何创网站
  • 网站开发进修网站做301将重定向到新域名
  • 公司网站开发费用账务处理ucenter wordpress
  • 六站合一的优势少儿编程机构
  • 软件开发与网站开发学做美食网站哪个好
  • 网站搜索 收录优化百度推广页面投放
  • 响应式网站的优点浙江省网站域名备案
  • 网站安全 扫描深圳被点名批评
  • 在哪个网站可以一对一做汉教网站优化策略
  • 龙岩做网站的顺企网宁波网站建设
  • 昆山网站建设河北连锁餐厅vi设计公司
  • 新蔡县住房和城乡建设局网站南昌租房网地宝网
  • 南宁做网站费用iis编辑网站绑定
  • 家用宽带做网站服务器建网站费用明细
  • 电商 网站 降低 跳出率 措施 效果书画院网站模板
  • 兰州移动官网网站建设上海工商网上公示系统