其他分享
首页 > 其他分享> > DesignPatternOberver观察者模式

DesignPatternOberver观察者模式

作者:互联网

目录

DesignPatternOberver观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

标准定义

UML图

观察者模式包含四个角色

实际案例

场景模拟

爱玩联盟,之前还了解过联盟一点点的背景故事。符文大陆的国家艾欧尼亚很垃圾,诺克萨斯牛逼,就要干艾欧尼亚。首先,打仗,莽之前要观察对面的国家状态,他们牛逼还打啥了。选中他们最弱的时候干

UML图

代码实现

package my

import "fmt"

type Subject interface {
	Attach()           // 添加观察者们
	Notify(o Observer) // 通知观察者
}

type Ionia struct {
	Name      string
	Observers []Observer // 一直默默注视他的人
	State     bool       // 自己的状态 true: 表示自己状态很好,不能被攻击
}

func NewIonia() *Ionia {
	return &Ionia{
		Name:      "艾欧尼亚",
		Observers: make([]Observer, 0),
		State:     true,
	}
}

func (i *Ionia) SetState(b bool) {
	i.State = b
}

func (i *Ionia) GetState() bool {
	return i.State
}

func (i *Ionia) Attach(o Observer) {
	i.Observers = append(i.Observers, o)
}

func (i *Ionia) Notify() {
	for _, observer := range i.Observers {
		if i.State {
			fmt.Println("艾欧尼亚现在牛逼不能进攻")
			continue
		}

		observer.Update()
	}
}

type Observer interface {
	Update() // 根据情报做出相应的动作
}

type Noxus struct {
	Name string
}

func NewNoxus() *Noxus {
	return &Noxus{Name: "诺克萨斯"}
}

func (n *Noxus) Update() {
	fmt.Println("攻打艾欧尼亚")
}

func TTmain() {
	ionia := NewIonia()
	noxus := NewNoxus()

	ionia.Attach(noxus)

	for i := 0; i <= 5; i++ {
		if i%2 == 0 {
			ionia.SetState(false)
		} else {
			ionia.SetState(true)
		}

		ionia.Notify()
	}
}


# 测试ttmain()输出
攻打艾欧尼亚
艾欧尼亚现在牛逼不能进攻
攻打艾欧尼亚
艾欧尼亚现在牛逼不能进攻
攻打艾欧尼亚
艾欧尼亚现在牛逼不能进攻

业务拓展

场景模拟

如果是这样的话,太简单了。再来个场景: 诺克萨斯之前的罪过恕瑞玛。当诺克萨斯干别人时候,自己也是最空虚的时候。这时候就干他

核心点+疑难杂症

标签:Observer,观察者,模式,Observers,State,func,Ionia,DesignPatternOberver
来源: https://www.cnblogs.com/maomaomaoge/p/14126275.html