实现中介者模式示例,添加中介者、同事类及具体实现,增强代码可读性
This commit is contained in:
parent
f579b1a5cc
commit
78d4634cf3
|
|
@ -0,0 +1,97 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
实例:
|
||||||
|
汤宝宝一时想不开,当了房产中介。
|
||||||
|
他负责把房东和租客撮合在一起,帮他们达成租房协议。
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 抽象中介者
|
||||||
|
type Mediator interface {
|
||||||
|
register(colleague Colleague)
|
||||||
|
Notify(sender Colleague, event string)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体中介者 - 房产中介
|
||||||
|
type HousingMediator struct {
|
||||||
|
colleagues []Colleague
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *HousingMediator) register(colleague Colleague) {
|
||||||
|
if slices.Contains(m.colleagues, colleague) {
|
||||||
|
return // 已注册
|
||||||
|
}
|
||||||
|
m.colleagues = append(m.colleagues, colleague)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *HousingMediator) Notify(sender Colleague, event string) {
|
||||||
|
for _, colleague := range m.colleagues {
|
||||||
|
if colleague != sender {
|
||||||
|
colleague.Receive(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 抽象同事类
|
||||||
|
type Colleague interface {
|
||||||
|
Send(event string)
|
||||||
|
Receive(event string)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体同事类 - 房东
|
||||||
|
type Landlord struct {
|
||||||
|
mediator Mediator
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Landlord) Send(event string) {
|
||||||
|
fmt.Printf("房东%s发布信息: %s\n", l.name, event)
|
||||||
|
l.mediator.Notify(l, event)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Landlord) Receive(event string) {
|
||||||
|
fmt.Printf("房东%s收到通知: %s\n", l.name, event)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体同事类 - 租客
|
||||||
|
type Tenant struct {
|
||||||
|
mediator Mediator
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tenant) Send(event string) {
|
||||||
|
fmt.Printf("租客%s发布需求: %s\n", t.name, event)
|
||||||
|
t.mediator.Notify(t, event)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tenant) Receive(event string) {
|
||||||
|
fmt.Printf("租客%s收到通知: %s\n", t.name, event)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println("============= 中介者模式 =============")
|
||||||
|
|
||||||
|
mediator := &HousingMediator{}
|
||||||
|
|
||||||
|
landlord1 := &Landlord{mediator: mediator, name: "张三"}
|
||||||
|
landlord2 := &Landlord{mediator: mediator, name: "李四"}
|
||||||
|
tenant1 := &Tenant{mediator: mediator, name: "王五"}
|
||||||
|
tenant2 := &Tenant{mediator: mediator, name: "赵六"}
|
||||||
|
|
||||||
|
mediator.register(landlord1)
|
||||||
|
mediator.register(landlord2)
|
||||||
|
mediator.register(tenant1)
|
||||||
|
mediator.register(tenant2)
|
||||||
|
|
||||||
|
landlord1.Send("张三有一套两室一厅的房子出租,月租2000元。")
|
||||||
|
fmt.Println("-----")
|
||||||
|
tenant1.Send("王五需要一套三室的房子,预算3000元/月。")
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("=========== 中介者模式结束 ===========")
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
"""
|
||||||
|
实例:
|
||||||
|
汤宝宝一时想不开,当了房产中介。
|
||||||
|
他负责把房东和租客撮合在一起,帮他们达成租房协议。
|
||||||
|
"""
|
||||||
|
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
|
||||||
|
|
||||||
|
# 抽象同事类
|
||||||
|
class Colleague(ABC):
|
||||||
|
@abstractmethod
|
||||||
|
def send(self, event: str) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def receive(self, event: str) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# 抽象中介者
|
||||||
|
class Mediator(ABC):
|
||||||
|
@abstractmethod
|
||||||
|
def notify(self, sender: Colleague, event: str) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def register(self, colleague: Colleague) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# 具体同事类:房东
|
||||||
|
class Landlord(Colleague):
|
||||||
|
mediator: Mediator
|
||||||
|
name: str
|
||||||
|
|
||||||
|
def __init__(self, mediator: Mediator, name: str) -> None:
|
||||||
|
self.mediator = mediator
|
||||||
|
self.name = name
|
||||||
|
self.mediator.register(self)
|
||||||
|
|
||||||
|
def send(self, event: str) -> None:
|
||||||
|
print(f"房东{self.name}发布信息: {event}")
|
||||||
|
self.mediator.notify(self, event)
|
||||||
|
|
||||||
|
def receive(self, event: str) -> None:
|
||||||
|
print(f"房东{self.name}收到通知: {event}")
|
||||||
|
|
||||||
|
|
||||||
|
# 具体同事类:租客
|
||||||
|
class Tenant(Colleague):
|
||||||
|
mediator: Mediator
|
||||||
|
name: str
|
||||||
|
|
||||||
|
def __init__(self, mediator: Mediator, name: str) -> None:
|
||||||
|
self.mediator = mediator
|
||||||
|
self.name = name
|
||||||
|
self.mediator.register(self)
|
||||||
|
|
||||||
|
def send(self, event: str) -> None:
|
||||||
|
print(f"租客{self.name}发布需求: {event}")
|
||||||
|
self.mediator.notify(self, event)
|
||||||
|
|
||||||
|
def receive(self, event: str) -> None:
|
||||||
|
print(f"租客{self.name}收到通知: {event}")
|
||||||
|
|
||||||
|
|
||||||
|
# 具体中介者类
|
||||||
|
class HousingMediator(Mediator):
|
||||||
|
colleagues: list[Colleague] = []
|
||||||
|
|
||||||
|
def register(self, colleague: Colleague) -> None:
|
||||||
|
if colleague not in self.colleagues:
|
||||||
|
self.colleagues.append(colleague)
|
||||||
|
|
||||||
|
def notify(self, sender: Colleague, event: str) -> None:
|
||||||
|
for colleague in self.colleagues:
|
||||||
|
if colleague != sender:
|
||||||
|
colleague.receive(event)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("============= 中介者模式 =============")
|
||||||
|
|
||||||
|
mediator = HousingMediator()
|
||||||
|
|
||||||
|
landlord1 = Landlord(mediator, "张三")
|
||||||
|
landlord2 = Landlord(mediator, "李四")
|
||||||
|
tenant1 = Tenant(mediator, "王五")
|
||||||
|
tenant2 = Tenant(mediator, "赵六")
|
||||||
|
|
||||||
|
landlord1.send("张三有一套两室一厅的房子出租,月租2000元。")
|
||||||
|
print("-----")
|
||||||
|
tenant1.send("王五需要一套三室的房子,预算3000元/月。")
|
||||||
|
|
||||||
|
print("\n=========== 中介者模式结束 ===========")
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
实例:
|
||||||
|
汤宝宝一时想不开,当了房产中介。
|
||||||
|
他负责把房东和租客撮合在一起,帮他们达成租房协议。
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 抽象中介者
|
||||||
|
interface Mediator {
|
||||||
|
register(colleague: Colleague): void;
|
||||||
|
notify(sender: Colleague, event: string): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 抽象同事
|
||||||
|
interface Colleague {
|
||||||
|
send(event: string): void;
|
||||||
|
receive(event: string): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体中介者
|
||||||
|
class HousingMediator implements Mediator {
|
||||||
|
private colleagues: Colleague[];
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.colleagues = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
register(colleague: Colleague): void {
|
||||||
|
if (!this.colleagues.includes(colleague)) {
|
||||||
|
this.colleagues.push(colleague);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
notify(sender: Colleague, event: string): void {
|
||||||
|
for (const colleague of this.colleagues) {
|
||||||
|
if (colleague !== sender) {
|
||||||
|
colleague.receive(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体同事 - 房东
|
||||||
|
class Landlord implements Colleague {
|
||||||
|
private mediator: Mediator;
|
||||||
|
private name: string;
|
||||||
|
|
||||||
|
constructor(mediator: Mediator, name: string) {
|
||||||
|
this.mediator = mediator;
|
||||||
|
this.name = name;
|
||||||
|
this.mediator.register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
send(event: string): void {
|
||||||
|
console.log(`房东${this.name}发布信息: ${event}`);
|
||||||
|
this.mediator.notify(this, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
receive(event: string): void {
|
||||||
|
console.log(`房东${this.name}收到通知: ${event}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体同事 - 租客
|
||||||
|
class Tenant implements Colleague {
|
||||||
|
private mediator: Mediator;
|
||||||
|
private name: string;
|
||||||
|
|
||||||
|
constructor(mediator: Mediator, name: string) {
|
||||||
|
this.mediator = mediator;
|
||||||
|
this.name = name;
|
||||||
|
this.mediator.register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
send(event: string): void {
|
||||||
|
console.log(`租客${this.name}发布需求: ${event}`);
|
||||||
|
this.mediator.notify(this, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
receive(event: string): void {
|
||||||
|
console.log(`租客${this.name}收到通知: ${event}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
console.log("============= 中介者模式 =============");
|
||||||
|
const mediator = new HousingMediator();
|
||||||
|
|
||||||
|
const landlord1 = new Landlord(mediator, "张三");
|
||||||
|
const landlord2 = new Landlord(mediator, "李四");
|
||||||
|
const tenant1 = new Tenant(mediator, "王五");
|
||||||
|
const tenant2 = new Tenant(mediator, "赵六");
|
||||||
|
|
||||||
|
landlord1.send("张三有一套两室一厅的房子出租,月租2000元。");
|
||||||
|
console.log("-----");
|
||||||
|
tenant1.send("王五需要一套三室的房子,预算3000元/月。");
|
||||||
|
|
||||||
|
console.log("\n=========== 中介者模式结束 ===========");
|
||||||
|
})();
|
||||||
Loading…
Reference in New Issue