中介者
由中介对象协调多个对象。
行为型
说明
当组件之间有复杂的两两依赖时,把协调逻辑集中到一个对象。
分析
Client 只把消息交给 Hub,而不直接持有其他 Client 的引用。Hub 可以集中决定广播、路由或过滤规则,减少组件之间的两两依赖。
Alice 只知道 Hub,Hub 在示例中只把消息追加到列表,并没有真正广播给其他客户端。将来增加路由时,应让 Hub 负责接收者选择,客户端负责自己的行为;把存储、认证和所有业务都塞入 Hub 会形成新的集中耦合。并发发送还需保护共享 Messages。
查看图表代码
适用前提与边界
中介者也可能膨胀成过大的协调中心,需要保持职责清晰。 交互流程很短且稳定时,直接调用通常更容易理解。
示例输入与调用
go
hub := new(Hub)
alice := Client{Name: "Alice", Hub: hub}
alice.Send("hello")
fmt.Println(hub.Messages)运行输出
text
[Alice: hello]完整 Go 示例
go
package main
import "fmt"
type Hub struct{ Messages []string }
func (h *Hub) Send(from, text string) {
h.Messages = append(h.Messages, from+": "+text)
}
type Client struct {
Name string
Hub *Hub
}
func (c Client) Send(text string) {
c.Hub.Send(c.Name, text)
}
func main() {
hub := new(Hub)
alice := Client{Name: "Alice", Hub: hub}
alice.Send("hello")
fmt.Println(hub.Messages)
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任