设计模式——观察模式
1.定义
定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时其相关依赖对象皆得到通知,并被自动更新
2.示例
在某多人联机对战游戏中,多个玩家可以加入同一战队组成联盟,当战队中的某一成员受到敌人攻击时将给所有其他盟友发送通知,盟友收到通知后将做出响应
3.类图说明

- AbsContorlCenter:抽象控制中心,也就是被观察者,包含AbsPlayer的引用。一个遍历player引用进而通知player的方法,还有玩家add,remove进list的方法
- ContorlCenter:具体控制中心,被观察者的一部分,实现抽象控制中心的方法。
- AbsPlayer:抽象玩家,也就是观察者,包含AbsContorlCenter的引用。一个被攻击的方法,一个收到盟友被攻击的方法。
- Player:具体玩家,也是观察者的一部分。包括一个构造函数,new的时候赋予名字。当player被攻击的时候,调用自己的被攻击的方法,从而调用调用控制中心的Notify方法。盟友收到控制中心发来的Notify方法之后,做出反应调用Update方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace observer
{
public abstract class AbsControlCenter
{
public string name;
public List<AbsPlayer> playerList;
public abstract void Notify();
public abstract void Add(AbsPlayer player);
public abstract void Remove(AbsPlayer player);
}
public class ControlCenter : AbsControlCenter
{
public ControlCenter(string name)
{
playerList = new List<AbsPlayer>();
this.name = name;
}
public override void Add(AbsPlayer Player)
{
playerList.Add(Player);
}
public override void Notify()
{
foreach(AbsPlayer ts in playerList)
{
ts.Update();
}
}
public override void Remove(AbsPlayer player)
{
foreach(AbsPlayer ts in playerList)
{
if (ts.Equals(player))
{
playerList.Remove(player);
return;
}
}
}
}
public abstract class AbsPlayer
{
public string name;
public ControlCenter controlCenter;
public abstract void Update();
public abstract void BeAttacked(AbsControlCenter absControlCenter);
}
public class Player : AbsPlayer
{
public Player(string name)
{
this.name = name;
}
public override void BeAttacked(AbsControlCenter controlCenter)
{
Console.WriteLine(name + "被攻击了");
controlCenter?.Notify();
}
public override void Update()
{
Console.WriteLine("我来帮你了:"+ name);
}
}
class Program
{
public static Random id = new Random();
static void Main(string[] args)
{
AbsControlCenter absControlCenter = new ControlCenter("虚拟现实技术班级");
AbsPlayer absPlayer = new Player("小刘");
AbsPlayer absPlayer1 = new Player("小黄");
AbsPlayer absPlayer2 = new Player("小李");
absControlCenter.Add(absPlayer);
absControlCenter.Add(absPlayer1);
absControlCenter.Add(absPlayer2);
absPlayer.BeAttacked(absControlCenter);
Console.ReadLine();
}
}
}
|
输出内容:
小刘被攻击了
我来帮你了:小黄
我来帮你了:小李