设计模式-观察者模式
什么是观察者设计模式?
观察者设计模式包含2个角色。被观察者和观察者,当被观察者发生变化时,会通知所有的观察者,观察者根据变化进行自我更新。
先上代码
type ObservableI interface {
AddObserver(User) //添加观察者
RemoveObserver(User) //移除观察者
Message() //发布消息
}
type Observer interface {
Update() //观察者更新事件
}
//被观察者 当被观察者变化, 观察者跟着变化
type User struct {
Name string
Friend []*User
}
func NewUser(str string) User{
return User{
Name:str,
Friend: []*User{},
}
}
func(user *User)AddObserver(user2 User){
user.Friend = append(user.Friend,&user2)
return
}
func(user *User)DeObserver(user2 User){
for k,v := range user.Friend{ // k是在数组中的位置, v是User
if v.Name == user2.Name {
user.Friend =append(user.Friend[:k],user.Friend[k+1:]...)//左开右闭
}
}
return
}
func(user *User)Message(str string) {
for _,v := range user.Friend{
v.Update(str)
}
return
}
func(user *User)Update(str string) string{
fmt.Println("我是"+user.Name+str)
return str
}
func main() {
//被观察者
object := NewUser("1")
item1 := NewUser("2")
item2 := NewUser("3")
item3 := NewUser("4")
object.AddObserver(item1)
object.AddObserver(item2)
object.AddObserver(item3)
object.DeObserver(item2)
object.Message("我去! 我是观察者发布的事件!!!")
}
被观察者
被观察者:需要一个容器来装观察对象(数组、map),当发生变化时通知容器里面的所有对象(观察者)。
被观察者需要实现哪些接口呢?
1.注册观察者(如何成为这个对象的观察者?调用这个方法)
2.删除观察者(如何不想观察被观察对象了?调用这个方法)
3.发布变化事件(通知所有的观察者,告诉他们被观察者发生了变化)
//被观察者 当被观察者变化, 观察者跟着变化
type User struct {
Name string
Friend []*User
}
func NewUser(str string) User{
return User{
Name:str,
Friend: []*User{},
}
}
func(user *User)AddObserver(user2 User){
user.Friend = append(user.Friend,&user2)
return
}
func(user *User)DeObserver(user2 User){
for k,v := range user.Friend{ // k是在数组中的位置, v是User
if v.Name == user2.Name {
user.Friend =append(user.Friend[:k],user.Friend[k+1:]...)//左开右闭
}
}
return
}
func(user *User)Message(str string) {
for _,v := range user.Friend{
v.Update(str)
}
return
}
观察者
观察者需要实现什么接口?
1.变化更新接口(当被观察者发生变化时,通过Message()方法通知所有的观察者。就是在Message()方法里面,调用所有观察者的Update()方法)
type Observer interface {
Update() //观察者更新事件
}
func(user *User)Update(str string) string{
fmt.Println("我是"+user.Name+str)
return str
}