一.观察者模式

  观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。

  观察者模式定义如下: 观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。

二.多人对战游戏

  Sunny软件公司欲开发一款多人联机对战游戏(类似魔兽世界、星际争霸等游戏),在该游戏中,多个玩家可以加入同一战队组成联盟,当战队中某一成员受到敌人攻击时将给所有其他盟友发送通知,盟友收到通知后将作出响应。

  Sunny软件公司开发人员需要提供一个设计方案来实现战队成员之间的联动。Sunny软件公司开发人员通过对系统功能需求进行分析,发现在该系统中战队成员之间的联动过程可以简单描述如下:联盟成员受到攻击-->发送通知给盟友-->盟友作出响应。

  如果按照上述思路来设计系统,由于联盟成员在受到攻击时需要通知他的每一个盟友,因此每个联盟成员都需要持有其他所有盟友的信息,这将导致系统开销较大,因此Sunny公司开发人员决定引入一个新的角色——“战队控制中心”——来负责维护和管理每个战队所有成员的信息。当一个联盟成员受到攻击时,将向相应的战队控制中心发送求助信息,战队控制中心再逐一通知每个盟友,盟友再作出响应

  结构图如下:

三.代码实现

目标类:AllyControlCenter

https://github.com/Aro710/Game_mul/blob/master/observer/demo/AllyControlCenter.java

public abstract class AllyControlCenter {/*** 战队名称*/protected String allyName;/*** 定义一个集合用于存储战队成员*/protected List<Observer> players = new ArrayList<Observer>();public String getAllyName() {return allyName;}public void setAllyName(String allyName) {this.allyName = allyName;}/*** 注册方法* @param player*/public void join(Observer player){System.out.println(MessageFormat.format("{0}加入{1}战队", player.getName(), this.allyName));players.add(player);}/*** 注销方法* @param player*/public void quit(Observer player){System.out.println();System.out.println(MessageFormat.format("{0}退出{1}战队", player.getName(), this.allyName));players.remove(player);}/*** 声明抽象通知方法*/public abstract void notifyObserver(String name);
}

具体目标类:ConcreteAllyControlCenter

https://github.com/Aro710/Game_mul/blob/master/observer/demo/ConcreteAllyControlCenter.java

public class ConcreteAllyControlCenter extends AllyControlCenter {public ConcreteAllyControlCenter(String allyName) {System.out.println(MessageFormat.format("{0}战队组件成功!", allyName));System.out.println();System.out.println("控制中心发布盟友召集令");System.out.println("---------------------------------");this.allyName = allyName;}@Overridepublic void notifyObserver(String name) {System.out.println();System.out.println(MessageFormat.format("{0}战队紧急通知:盟友{1}正在遭受攻击,请速速支援!", this.allyName, name));System.out.println();// 遍历观察者集合,调用每一个盟友(自己除外)的支援方法for(Observer player : this.players){if(!player.getName().equalsIgnoreCase(name)){player.help();}}}
}

抽象观察者:Observer

https://github.com/Aro710/Game_mul/blob/master/observer/demo/Observer.java

public interface Observer {/*** 获取观察者名字* @return*/String getName();/*** 设置观察者名字* @param name*/void setName(String name);/*** 声明支援盟友方法*/void help();/*** 声明遭受攻击方法* @param acc*/void beAttacted(AllyControlCenter acc);}

具体观察者:Player

https://github.com/Aro710/Game_mul/blob/master/observer/demo/Player.java

public class Player implements Observer {private String name;public Player(String name) {this.name = name;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}/*** 支援盟友方法的实现*/public void help() {System.out.println(MessageFormat.format("坚持住,{0}来救你!", this.name));}/*** 遭受攻击方法的实现,当遭受攻击时将调用战队控制中心类的通知方法notifyObserver()来通知盟友* @param acc*/public void beAttacted(AllyControlCenter acc) {System.out.println();System.out.println(MessageFormat.format("{0}被攻击", this.name));acc.notifyObserver(this.name);}
}

观察者模式的优点如下:

(1) 观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色。

(2) 观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。由于观察目标和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。

(3) 观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。

(4) 观察者模式满足“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。

转载于:https://www.cnblogs.com/aro7/p/9848723.html

多人对战游戏观察者模式分析相关推荐

  1. 多人对战游戏开发实例之《组队小鸡射击》(附源码)

    前言:该游戏项目主要是基于前端引擎Cocos Creator开发,涉及后端联网的部分,则通过接入Matchvs SDK完成快速开发工作. 准备工作 Matchvs JavaScript SDK 下载地 ...

  2. 多人对战游戏中的阵营需分与设计

    我们考虑一个组队大乱斗玩法,并分析其中关于阵营的需求与设计. 组队大乱斗玩法包含以下元素: 1.自己以及两名队友 2.两组敌军,每组敌军三名成员(与己方等同的实际玩家) 3.中立Boss及机关 4.散 ...

  3. .net 实时通信_【WebSocket】实时多人答题对战游戏

    本文公众号来源:后端技术漫谈 作者:蛮三刀把刀 前言 前两章教程,我们使用WebSocket的基础特性打造了一个小小聊天室,并在第二章对其进行了集群化改造. 系列教程回顾: 手把手搭建WebSocke ...

  4. 答题对战方案java_使用WebSocket实现实时多人答题对战游戏

    前言 前两章教程,我们使用WebSocket的基础特性打造了一个小小聊天室,并在第二章对其进行了集群化改造. 系列教程回顾: 在本文中,我将介绍如何使用WebSocket向实时多人答题对战游戏提供服务 ...

  5. [WebSocket]使用WebSocket实现实时多人答题对战游戏

    前言 前两章教程,我们使用WebSocket的基础特性打造了一个小小聊天室,并在第二章对其进行了集群化改造. 系列教程回顾: [WebSocket]第一章:手把手搭建WebSocket多人在线聊天室( ...

  6. NodeJS 开发多人实时对战游戏服务器 (一)

    从一个游戏情怀说起 接触的第一款多人对战游戏是帝国时代,依稀记得那时候上学每周最期待的就是冲到电脑课撸一把罗马复兴,高中开始接触<魔兽争霸3>,一款真正让我迷恋十多年的游戏,怀念那时候的& ...

  7. 为什么FPS对射的时候要来回跑--valve的多人对战同步技术

    https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking 较早的文章了,介绍了source引擎在多人对战网络同步(尤 ...

  8. 从零学习游戏服务器开发(一) 从一款多人联机实时对战游戏开始

    写在前面的话 经常有学生或者初学者问我如何去阅读和学习一个开源软件的代码,也有不少朋友在工作岗位时面对前同事留下的项目,由于文档不完善.代码注释少.工程数量大,而无从下手.本文将来通过一个多人联机实时 ...

  9. java实现两人对战的五子棋游戏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @java实现五子棋游戏 一.要求 编程实现控制台版并支持两人对战的五子棋游戏. (1)绘制棋盘 - 写一个成员方法实现 (2)提示黑 ...

最新文章

  1. 履带机器人运动控制器c++_敏捷得像猫,被抛出后能平稳着地,有意思的美国西点军校机器人!...
  2. BP网络Python实现代码
  3. Java连接Oracle数据库开发银行管理系统【一、需求篇】
  4. 【技巧】解决win10的1803版本下,无法收到1809推送、从而无法更新到1903版本的问题。...
  5. python2 dict 乱序_为什么我的python dict变得无序?
  6. 在java中关于枚举类型的特性_java枚举类型小结
  7. POJ2114-Boatherds-树分治
  8. MyBatis课程5
  9. C++ vector容器类型 (转)
  10. Android5更新包,Android5.1无法完成整包的更新
  11. ADS仿真4_滤波器设计
  12. 苹果iPad忘记了Apple ID密码该怎么办?(手机教程)
  13. Java平台 利用Common Configuration 读取配置文件
  14. 微信小程序-将时间转换成几秒前 几分钟前 几小时前 几天前等时间格式
  15. 微信小程序记录与项目实践
  16. 国内机器视觉发展如何实现逆风翻盘?
  17. 从视频中提取图片(截取ppt)
  18. 常见 Shell 指令
  19. 《软件方法(上)业务建模和需求》第2版 勘误(2021年10月21日更新)
  20. Python自动化:模拟人类在百度搜索页输入关键词进行搜索并打开搜索结果

热门文章

  1. vc.net matlab,基于Excel、Matlab和VC net实现立体天线方向图的重构和电平估算_
  2. YYCMS搭建影视网站教程
  3. [整理]PCB阻抗控制
  4. linux - 文件的所有者、所属组、其他人
  5. 爬虫实战5:爬取全部穿越火线武器的图片以武器名称命名保存到本地文件
  6. 江西2020年3月计算机二级考试时间,2020年3月江西计算机等级考试报名人数
  7. Linux内核开发——内核镜像文件及启动过程
  8. 网络工程师,网络运维常用命令
  9. 宁德时代、联合利华入选全球“灯塔工厂”;西门子医疗上海创新中心正式启用 | 美通社头条...
  10. 厉害了我们的“中国制造”,新能源“智造”强大到你想象不到