typescript: Mediator pattern
/**
*
* Mediator pattern 中介者是一种行为设计模式, 让程序组件通过特殊的中介者对象进行间接沟通, 达到减少组件之间依赖关系的目的。
* file: Mediatorts.ts
* The Mediator interface declares a method used by components to notify the
* mediator about various events. The Mediator may react to these events and
* pass the execution to other components.
*/
interface Mediator {
notify(sender: object, event: string): void; //void
}
/**
* Concrete Mediators implement cooperative behavior by coordinating several
* components.
*/
class ConcreteMediator implements Mediator {
private component1: Component1;
private component2: Component2;
constructor(c1: Component1, c2: Component2) {
this.component1 = c1;
this.component1.setMediator(this);
this.component2 = c2;
this.component2.setMediator(this);
}
public notify(sender: object, event: string):string { //void
let getstr="";
if (event === 'A') {
console.log('Mediator reacts on A and triggers following operations:');
this.component2.doC();
getstr="Mediator reacts on A and triggers following operations:";
getstr=getstr+this.component2.doC();
}
if (event === 'D') {
console.log('Mediator reacts on D and triggers following operations:');
this.component1.doB();
this.component2.doC();
getstr="Mediator reacts on D and triggers following operations:";
getstr=getstr+this.component1.doB()+","+this.component2.doC();
}
return getstr;
}
}
/**
* The Base Component provides the basic functionality of storing a mediator's
* instance inside component objects.
*/
class BaseComponent {
protected mediator: Mediator;
constructor(mediator?: Mediator) {
this.mediator = mediator!;
}
public setMediator(mediator: Mediator): void {
this.mediator = mediator;
}
}
/**
* Concrete Components implement various functionality. They don't depend on
* other components. They also don't depend on any concrete mediator classes.
*/
class Component1 extends BaseComponent {
/**
*
* @returns
*/
public doA(): string { //void
console.log('Component 1 does A.');
this.mediator.notify(this, 'A');
return "Component 1 does A."
}
/**
*
* @returns
*/
public doB(): string { //void
console.log('Component 1 does B.');
this.mediator.notify(this, 'B');
return "Component 1 does B.";
}
}
/**
*
*/
class Component2 extends BaseComponent {
/**
*
* @returns
*/
public doC(): string {
console.log('Component 2 does C.');
this.mediator.notify(this, 'C');
return "Component 2 does C.";
}
/**
*
* @returns
*/
public doD(): string {
console.log('Component 2 does D.');
this.mediator.notify(this, 'D');
return "Component 2 does D.";
}
}
let pubMediator1="";
let pubMediator2="";
let pubMediator3="Geovin Du";
let pubMediator4="geovindu";
/**
* The client code.
*/
const c1 = new Component1();
const c2 = new Component2();
const mediator = new ConcreteMediator(c1, c2);
console.log('Client triggers operation A.');
pubMediator1=c1.doA();
console.log('');
console.log('Client triggers operation D.');
pubMediator2=c2.doD();
pubMediator3=mediator.notify(c1,"A");//B
pubMediator4=mediator.notify(c2,"D");//C
let messageMediator: string = 'Hello World,This is a typescript!,涂聚文 Geovin Du.Web';
document.body.innerHTML = messageMediator+",<br/>one="+pubMediator1+",<br/>two="+pubMediator2+",<br/>three="+pubMediator3+",<br/>four="+pubMediator4+",<br/>TypeScript Command Pattern 命令模式";
调用:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<head><title>TypeScript Hello Mediator pattern 中介者模式</title>
<meta name="Description" content="geovindu,涂聚文,Geovin Du"/>
<meta name="Keywords" content="geovindu,涂聚文,Geovin Du"/>
<meta name="author" content="geovindu,涂聚文,Geovin Du"/>
</head>
<body>
<script src="dist/Mediatorts.js"></script>
</body>
</html>
输出:

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号