简介
程序应用有大大小小的对象的组成,将大对象拆分成小对象可以提高复用性,但是相对应的可能也会造成对象之间的关联程度增大,降低复用性。中介者模式的设计在于提供一个统一的中间者管理这些对象,降低对象之间的耦合性。将对象之间的多对多关系转化为一对多的关系
demo
假设有一场比赛,分为两个队伍,当一个队伍全部died后,另外一个队伍获胜,如果不存在中介者的时候,需要保存自己伙伴和敌人,每个对象之间紧紧耦合在一起。如果想增加同伙和增加队伍等都会非常麻烦,下面引入一种中介者进行统一管理,减少对象之间的耦合关系
class Player{
public team:string;
public name:string;
public state:string;
constructor(team:string,name:string){
this.team = team;
this.name = name;
this.state = "alive";
PlayerManager.add(this);
}
died(){
this.state = "died";
PlayerManager.lose(this);
}
lose(){
console.log(`${this.name}失败`);
}
win(){
console.log(`${this.name}获胜`);
}
}
interface IPManager{
add:(player:Player)=>void;
lose:(Player:Player)=>void;
}
const PlayerManager:IPManager = (function(){
const players = {};
return {
add(player:Player){
const color:string = player.team;
players[color] = players[color]||[];
players[color].push(player);
},
lose(player:Player){
const teamColor:string = player.team;
let all_dead:boolean = true;
for(let i =0,player:Player;player = players[teamColor][i++];){
if(player.state==="alive"){
all_dead = false;
break;
}
}
// 本队全部死亡
if(all_dead){
for(let i = 0,player:Player;player = players[teamColor][i++];){
player.lose();
}
for(const color in players){
if(color!==teamColor){
players[color].forEach((player:Player)=>{
player.win();
})
}
}
}
}
}
})()
const player1 = new Player("blue","张一");
const player2 = new Player("blue","张二");
const player3 = new Player("blue","张三");
const player4 = new Player("red","王一");
const player5 = new Player("red","王二");
const player6 = new Player("red","王三");
player1.died();
player2.died();
player3.died();
//张一失败
//张二失败
//张三失败
//王一获胜
//王二获胜
//王三获胜
如果想在当前基础上增加队伍,或者增加其他功能也是非常的方便
总结
中介者模式可以有效降低对象之间的耦合性,符合最小知识原则,即对象尽可能少的了解其他对象。但也不是没有缺点,中介者模式其实是将对象之间的关联复杂性转移为中介者对象的复杂性,中介者对象本身是一个非常庞大的系统,难以维护。
写程序是快速交付生产,而不是过渡的堆砌模式和设计