diff --git a/go/mediator/main.go b/go/mediator/main.go new file mode 100644 index 0000000..0eff950 --- /dev/null +++ b/go/mediator/main.go @@ -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("=========== 中介者模式结束 ===========") +} diff --git a/python/mediator/main.py b/python/mediator/main.py new file mode 100644 index 0000000..f0a8cdf --- /dev/null +++ b/python/mediator/main.py @@ -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=========== 中介者模式结束 ===========") diff --git a/ts/src/mediator/index.ts b/ts/src/mediator/index.ts new file mode 100644 index 0000000..538d1c5 --- /dev/null +++ b/ts/src/mediator/index.ts @@ -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=========== 中介者模式结束 ==========="); +})();