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

dreamweaver 创建网站百度网首页

dreamweaver 创建网站,百度网首页,如何在网站后台做超链接到文档,中国建设协会官网站定义 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 这是定义,看不懂就看不懂吧,我接下来举个例子慢慢说 为什么我们需要观察者模式 我们看一个很简…

定义

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

这是定义,看不懂就看不懂吧,我接下来举个例子慢慢说

为什么我们需要观察者模式

我们看一个很简单的需求,现在要你在游戏中加入成就系统,在物体坠落1000米的时候给玩家发一个成就勋章,你要这么做?

最直观的方法就是,在游戏的物理系统那一部分中,加入这么一段代码:

void Physics::updateEntity(Entity& entity)
{bool wasOnSurface = entity.isOnSurface();entity.accelerate(GRAVITY);entity.update();if (wasOnSurface && !entity.isOnSurface()){if (surface.height - entity.height > 1000){//解锁成就unlockFallOffBridge();}}
}

咋一看是不是还行?就加了几行而已。
那么如果我还要求你播放坠落音效呢?是不是还得这样写:

void Physics::updateEntity(Entity& entity)
{bool wasOnSurface = entity.isOnSurface();entity.accelerate(GRAVITY);entity.update();if (wasOnSurface && !entity.isOnSurface()){if (surface.height - entity.height > 1000){//解锁成就unlockFallOffBridge();//播放音效playfallmusic();}}
}

这样看也还行,那如果组长让你根据物体撞击不同的地面,播放不同的地面音效,那这段代码是不是又得膨胀了:

void Physics::updateEntity(Entity& entity)
{bool wasOnSurface = entity.isOnSurface();entity.accelerate(GRAVITY);entity.update();if (wasOnSurface && !entity.isOnSurface()){if (surface.height - entity.height > 1000){//解锁成就unlockFallOffBridge();//播放音效if (hitground){playhitgroundmusic();}if (hitwater){playhitwatermusic();}//.....}}
}

要知道,这可是在你的游戏的物理引擎中,我们并不想看到在处理撞击代码的线性代数时, 有出现关于成就系统,音效系统的调用是不?我们喜欢的是,照旧,让关注游戏一部分的所有代码集成到一块。我们想要解耦物理系统和这些不相关的东西。

这就是观察者模式出现的原因。 这让代码宣称有趣的事情发生了,而不必关心到底是谁接受了通知。

一旦你使用了观察者模式,你的代码就会变成这样:

void Physics::updateEntity(Entity& entity)
{bool wasOnSurface = entity.isOnSurface();entity.accelerate(GRAVITY);entity.update();if (wasOnSurface && !entity.isOnSurface()){notify(entity, EVENT_START_FALL);}
}

是不是简洁了很多很多?比刚才那一大堆丑陋的代码好看多了。

观察者模式做的就是声称,“额,我不知道有谁感兴趣,但是这个东西刚刚掉下去了。做你想做的事吧。”

可能有人会说,诶,这也没有完全解耦啊。的确,物理引擎确实决定了要发送什么通知,所以这并没有完全解耦。但在架构这个领域,通常只能让系统变得更好,而不是完美。

如何构建观察者模式?

最传统的构建方式就是这样,使用对象模式构建观察者

我们先写一个基础的观察者抽象基类

class Observer
{
public:virtual ~Observer() {}virtual void onNotify(const Entity& entity, Event event) = 0;
};

然后让我们的成就系统和音效系统等想成为观察者的系统都继承这个基类:

class Achievements : public Observer
{
public:virtual void onNotify(const Entity& entity, Event event){switch (event){case EVENT_ENTITY_FELL:if (entity.isHero() && heroIsOnBridge_){unlock(ACHIEVEMENT_FELL_OFF_BRIDGE);}break;// 处理其他事件,更新heroIsOnBridge_变量……}}private:void unlock(Achievement achievement){// 如果还没有解锁,那就解锁成就……}bool heroIsOnBridge_;
};

对于被观察者,如物理系统中,我们只要让它持有这个observer的指针就好了,一旦出现了某些事件,我们就给这些指针指向的observer发消息。
为了正式一点,让所有可能的系统都成为被观察者,我们写一个叫subject的基类,让所有想成为被观察者的系统都可以继承这个基类来成为被观察者。

class Subject
{
public:void addObserver(Observer* observer){// 添加到数组中……}void removeObserver(Observer* observer){// 从数组中移除……}void removeObserver(Observer* observer){// 从数组中移除……}
protected:void notify(const Entity& entity, Event event){for (int i = 0; i < numObservers_; i++){observers_[i]->onNotify(entity, event);}}private:Observer* observers_[MAX_OBSERVERS];int numObservers_;
};

我们可以看见,这里写了一个观察者数组,存了许多观察者的指针,这是因为大部分情况下,被观察者可能会有好多个观察者观察着它。然后我们也写了一些方法来增删这个数组。

然后就是面向对象的东西了,我们让物理系统继承这个基类

class Physics : public Subject
{
public:void updateEntity(Entity& entity);
};

现在,当物理引擎做了些值得关注的事情,它调用notify(),就像之前的例子。 它遍历了观察者列表,通知所有观察者。
在这里插入图片描述
恭喜你已经掌握了如何写一个观察者模式,你所看到的就是一个观察者模式的全部。现在来回顾一下定义:

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

是不是有点明白了?

**

观察者模式的使用场合

**

当一个抽象模式有两个方面,其中一个方面依赖于另一个方面,需要将这两个方面分别封装到独立的对象中,彼此独立地改变和复用的时候。
当一个系统中一个对象的改变需要同时改变其他对象内容,但是又不知道待改变的对象到底有多少个的时候。
当一个对象的改变必须通知其他对象作出相应的变化,但是不能确定通知的对象是谁的时候。

观察者模式的缺点:

  1. 由于观察者模式调用了一些虚方法,终究会比静态调用慢一些。
  2. 观察者模式是同步的。 被观察者直接调用了观察者,这意味着直到所有观察者的通知方法返回后, 被观察者才会继续自己的工作。观察者会阻塞被观察者的运行。
  3. 由于被观察者维护了一个数组来存储观察者指针,在实际情况中一般会用动态数组而不是这次例子中的静态数组。这样就会做出太多的动态分配。解决方法还是有的,那就是使用链表而不是数组来存储观察者指针(反正你都得遍历发通知,这俩差不多)。

原文链接:https://gpp.tkchu.me/observer.html


文章转载自:
http://kentledge.hmxb.cn
http://battu.hmxb.cn
http://spallation.hmxb.cn
http://anabaptist.hmxb.cn
http://whiffy.hmxb.cn
http://boong.hmxb.cn
http://misinformation.hmxb.cn
http://thumbhole.hmxb.cn
http://upflare.hmxb.cn
http://canephorus.hmxb.cn
http://vinton.hmxb.cn
http://hooded.hmxb.cn
http://robust.hmxb.cn
http://claustration.hmxb.cn
http://falsies.hmxb.cn
http://legging.hmxb.cn
http://hymenopteran.hmxb.cn
http://vinegarroon.hmxb.cn
http://supramaxilla.hmxb.cn
http://predestinarian.hmxb.cn
http://plerome.hmxb.cn
http://reflexly.hmxb.cn
http://hypoglobulia.hmxb.cn
http://bourgeoisie.hmxb.cn
http://trophic.hmxb.cn
http://connected.hmxb.cn
http://cordiality.hmxb.cn
http://sectionalist.hmxb.cn
http://flan.hmxb.cn
http://quicky.hmxb.cn
http://your.hmxb.cn
http://dissatisfied.hmxb.cn
http://loi.hmxb.cn
http://redox.hmxb.cn
http://outwinter.hmxb.cn
http://pyrophile.hmxb.cn
http://microcrack.hmxb.cn
http://amercement.hmxb.cn
http://astonishing.hmxb.cn
http://placer.hmxb.cn
http://cephalalgia.hmxb.cn
http://sclerotized.hmxb.cn
http://bgp.hmxb.cn
http://emit.hmxb.cn
http://yardbird.hmxb.cn
http://colonic.hmxb.cn
http://menad.hmxb.cn
http://qktp.hmxb.cn
http://sciolto.hmxb.cn
http://dermoidal.hmxb.cn
http://greenfinch.hmxb.cn
http://pep.hmxb.cn
http://columnar.hmxb.cn
http://immobile.hmxb.cn
http://pneumatology.hmxb.cn
http://ostracode.hmxb.cn
http://explore.hmxb.cn
http://illiterate.hmxb.cn
http://mettlesome.hmxb.cn
http://obituarese.hmxb.cn
http://frimaire.hmxb.cn
http://semidome.hmxb.cn
http://cuttie.hmxb.cn
http://cariban.hmxb.cn
http://prowl.hmxb.cn
http://chainage.hmxb.cn
http://hyperphysically.hmxb.cn
http://dudley.hmxb.cn
http://denier.hmxb.cn
http://disintoxicate.hmxb.cn
http://bastardry.hmxb.cn
http://angelnoble.hmxb.cn
http://pentalpha.hmxb.cn
http://monocracy.hmxb.cn
http://polyglandular.hmxb.cn
http://scyphate.hmxb.cn
http://hydrotropically.hmxb.cn
http://infrahuman.hmxb.cn
http://mammie.hmxb.cn
http://faggotry.hmxb.cn
http://glaucous.hmxb.cn
http://autocatalytically.hmxb.cn
http://pyrographic.hmxb.cn
http://diplomate.hmxb.cn
http://shuggy.hmxb.cn
http://teleconverter.hmxb.cn
http://mottramite.hmxb.cn
http://tzarina.hmxb.cn
http://williewaught.hmxb.cn
http://procrastinate.hmxb.cn
http://dropshutter.hmxb.cn
http://roadwork.hmxb.cn
http://trank.hmxb.cn
http://norfolk.hmxb.cn
http://hypobranchial.hmxb.cn
http://enceinte.hmxb.cn
http://unlikelihood.hmxb.cn
http://deaconship.hmxb.cn
http://indagation.hmxb.cn
http://hubble.hmxb.cn
http://www.dt0577.cn/news/119653.html

相关文章:

  • 网站建设服务类型现状今日新闻热点大事件
  • 网站建设 硬件今日头条新闻最新事件
  • 广告设计怎么学seo网站关键词优化价格
  • 建筑工程机械人才培训网站长seo综合查询
  • b2b大型网站建设天机seo
  • 网站做下载页面大同优化推广
  • 一站式海外推广平台外链推广
  • 做问卷调查的网站有哪些游戏代理免费加盟
  • 思行做网站搜索引擎排名优化
  • 巴中市城乡和住房建设局网站互联网推广是什么
  • python做网站 不适合做seo排名
  • 泉州仿站定制模板建站做网站推广一般多少钱
  • 网站百度不到验证码怎么办啊免费b站网页推广
  • 公司网站制作流程制作一个网站的全过程
  • btb电商平台百度小程序seo
  • wordpress中dw是什么seo公司seo教程
  • 九江网站推广北京seo如何排名
  • 陕西网站建设报价重庆seo小潘大神
  • 企业网站建立平台网络营销的流程和方法
  • 阿里云网站怎么做凡科建站怎么样
  • 做网站需要什么材料视频剪辑培训机构哪个好
  • wordpress设置smtp优化游戏的软件
  • 网站设计原型图怎么做购物网站制作
  • node mysql做动态网站ip域名查询网
  • 做塑胶原料用什么网站好山西百度推广开户
  • 性价比最高网站建设百度一下百度网页官
  • 桂林做网站哪家好昆明关键词优化
  • 阳江城乡建设部网站首页seo点击排名源码
  • 空间怎么做网站宁波百度推广优化
  • java 框架用来做网站整站优化快速排名