javascript 中介者模式 mediator
* player.js
/**
* 中介者模式
* @param {*} name 角色名称
* @param {*} teamColor 队伍颜色
*/
function Player(name, teamColor) {
this.name = name;
this.teamColor = teamColor;
this.state = "alive"; // 玩家生存状态
} Player.prototype.win = function() {
console.log(this.name + " won");
} Player.prototype.lose = function() {
console.log(this.name + " lost");
} Player.prototype.die = function() {
this.state = "dead";
// 给中介者发消息 玩家死亡
playerDirector.ReceiveMessage('playerDead', this);
} Player.prototype.remove = function() {
// 给中介者发消息 玩家掉线
playerDirector.ReceiveMessage('removePlayer', this);
} Player.prototype.changeTeam = function(color) {
// 给中介者发消息 玩家换队
playerDirector.ReceiveMessage('changeTeam', this, color);
} var playerFactory = function(name, teamColor) {
// 创造一个新的玩家对象
var newPlayer = new Player(name, teamColor);
// 给中介者发送消息, 玩家换队
playerDirector.ReceiveMessage('addPlayer', newPlayer); return newPlayer;
} // 中介者对象
var playerDirector = (function() {
var players = {}, // 保存所有玩家
operations = {}; // 中介者可以执行的操作 /************ 新增一个玩家 **************/
operations.addPlayer = function(player) {
// 玩家的队伍颜色
var teamColor = player.teamColor;
// 如果该颜色的玩家还没有成立队伍, 则新成立一个队伍
players[teamColor] = players[teamColor] || [];
players[teamColor].push(player); // 添加玩家进队伍
} /********** 移除一个玩家 ***************/
operations.removePlayer = function(player) {
var teamColor = player.teamColor,
teamPlayers = players[teamColor] || [];
// 遍历删除
for (var i = teamPlayers.length-1; i >= 0; i--) {
if (teamPlayers[i] === player) {
teamPlayers.splice(i, 1);
break;
}
}
} /************* 玩家换队 ******************/
operations.changeTeam = function(player, newTeamColor) {
operations.removePlayer(player); // 从原队伍中删除
player.teamColor = newTeamColor; // 改变队伍颜色
operations.addPlayer(player); // 添加到新队伍中
} /************* 玩家死亡 ****************/
operations.playerDead = function(player) {
var teamColor = player.teamColor, teamPlayers = players[teamColor];
var all_dead = true;
for (var i = 0, player; player = teamPlayers[i]; i++) {
if (player.state !== 'dead') {
all_dead = false;
break;
}
}
if (all_dead) {
teamPlayers.forEach(function(player) {
player.lose();
});
for (var color in players) {
if (color !== teamColor) {
players[color].forEach(function(player) {
player.win();
});
}
}
}
} var ReceiveMessage = function() {
var message = Array.prototype.shift.call(arguments);
operations[message].apply(this, arguments);
} return {
ReceiveMessage: ReceiveMessage
} })(); var player1 = playerFactory('皮蛋', 'red'),
player2 = playerFactory('小怪', 'red'),
player3 = playerFactory('宝宝', 'red'),
player4 = playerFactory('小强', 'red'); var player5 = playerFactory('黑妞', 'blue'),
player6 = playerFactory('葱头', 'blue'),
player7 = playerFactory('胖墩', 'blue'),
player8 = playerFactory('海盗', 'blue'); // player1.die(); player2.die(); player3.die(); player4.die();
// player1.remove(); player2.remove(); player3.die(); player4.die();
player1.changeTeam('blue'); player2.die(); player3.die(); player4.die();
Run:
VM394:17 小怪 lost
VM394:17 宝宝 lost
VM394:17 小强 lost
VM394:13 黑妞 won
VM394:13 葱头 won
VM394:13 胖墩 won
VM394:13 海盗 won
VM394:13 皮蛋 won
* 购物车
javascript 中介者模式 mediator的更多相关文章
- 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 中介者模式(Mediator Pattern)
用于减少多个对象或类之间的通信复杂性. 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合来维护代码.中介者模式属于行为模式类别. 实现实例 在这里通过一个聊天室的示例来演示中 ...
- 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- JavaScript 中介者模式与观察者模式有何不同?
http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailmvp 感觉二者非常像,都是pub/sub机制,如何进行区分 ...
- 18.中介者模式(Mediator Pattern)
using System; namespace Test { class Program { /// <summary> /// 中介者模式,定义了一个中介对象来封装一系列对象之间的交互关 ...
- 中介者模式(Mediator)
GOF:用一个中介对象来封装一系列的对象交互.中介者使对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 类图:
随机推荐
- 入门Kubernetes-StatefulSets
前言: 前面文中对通过DaemonSet.存储资源对象,实现了在指定节点中运行一个守护进程. 在真实的业务场景中,部署的服务都是有状态的.且有数据需要持久化的:那么如何实现呢? 那么接下来学习一种更加 ...
- 利用ST-LINK配合ST-LINK Utility 将bin文件下载到STM32的FLASH中
文章目录 背景 1.连接ST-LINK V2与单片机 2.配置工程 3.配置ST-LINK Utility 4.烧录bin文件 背景 项目需求,要把字模文件导入到32中FLASH的指定地址,使用了ST ...
- docker 安装mysql设置不区分表名大小写,创建minio,设置开机自启动
环境deepin mysql : docker run -p 3306:3306 --name tyer-mysql --restart=always -v $PWD/conf:/etc/mysql/ ...
- NOIP 模拟 $21\; \rm Game$
题解 考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了. 正解: 值域很小,所以我们开个桶,维护当前最大值. 如果新加入的值大于最大值,那么它肯定直接被下一个人选走 ...
- 题解 queen(留坑)
传送门 博客园突然打不开了,奇奇怪怪的-- 少写个等号没看出来 nm写反了没看出来 考完5min全拍出来了 手残属性加持 不对拍等于爆零 yysy,我连卢卡斯定理的存在都忘了-- 发现要让一大堆皇后能 ...
- ASP net core面试题汇总及答案
在dot net core中,我们不需要关心如何释放这些服务, 因为系统会帮我们释放掉.有三种服务的生命周期. 单实例服务, 通过add singleton方法来添加.在注册时即创建服务, 在随后的请 ...
- 【java虚拟机】Java内存模型
作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7518259.html 一.什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Jav ...
- spring知识点(面试题)
转自(参考):https://baijiahao.baidu.com/s?id=1595722523154435312&wfr=spider&for=pc 本人收集了一些在大家在面试时 ...
- Python环境变量配置
第一步:下载Python安装包 在Python的官网 www.python.org 中找到最新版本的Python安装包,点击进行下载,请注意,当你的电脑是32位的机器,请选择32位的安装包,如果是64 ...
- [SWMM]出现问题及解决
1,节点顺序 [错误]:如下图,在SWMM软件中普通节点到出水口的连接线不能正常连接,提示找不到出水口节点,但在inp文件中是存在的! [解决]:需要先写入点节点再写入线节点,即先写入[JUNCTIO ...