基本思想:将某个模块的启动逻辑也封装在该模块内。需要的方法至少有:注册方法、启动方法和优雅退出。
type Government interface {
Register(Department) error
Start() error
GracefulShutdown() error
}
type Department interface {
Name() string
Start(ch chan struct{
}) error
Secretary
}
type Secretary interface {
Send(mail Mail) error
Recv() (mail Mail, err error)
}
type Mail interface {
SourceDepartment() string
DestinationDepartment() string
Content() interface{
}
}
Department
Department代指每一个模块,每个模块都要实现Deparment的Name()方法和Start()方法,通过为每个模块指定Start()方法可以将每个模块的启动逻辑封装在该模块内,使得模块之间耦合更少。
Government
Government是所有模块的控制中心,所有模块在启动时向Government进行注册,Government的启动方法会调用每个模块自己的启动方法,Goverment的GracefulShutdown方法会给每个模块的关闭channel发送一条消息,让他们都停止执行。
Secretary
Secretary用于模块之间通信,每个模块都需要一个Secretary负责在Department之间收发信件。模块间的通信都必须通过Secretary进行,减少模块调用的耦合。
mail是一个封装了模块通信消息的接口,可以根据实际需要添加自己的方法。
下面是一个实现的例子
department_interface.go
package department
const (
MailBoxCapacity int = 128
)
var (
DepartmentMailbox map[string]chan Mail
)
type Government interface {
Register(department Department) error
Start() []error
GracefulShutdown() error
}
type Department interface {
Name() string
Start(ch chan struct{
}