using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignPattern
{
//观察者模式
//定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新
internal class ObserverPattern
{
}
#region 简单Demo
//抽象目标类
//abstract class Subject
//{
// //定义一个观察者集合用于存储所有观察者对象
// protected ArrayList observes = new ArrayList();
// //声明抽象注册方法,用于向观察者集合中增加一个观察者
// public abstract void Attach(Observer observer);
// //声明抽象注销方法,用于在观察者集合中删除一个观察者
// public abstract void Detach(Observer observer);
// //声明抽象通知方法
// public abstract void Notify();
//}
具体目标类
//class ConcrecteSubject : Subject
//{
// public override void Attach(Observer observer)
// {
// observes.Add(observer);
// }
// public override void Detach(Observer observer)
// {
// observes.Remove(observer);
// }
// public override void Notify()
// {
// //遍历观察者集合,调用每一个观察者的响应方法
// foreach (object obs in observes)
// {
// ((Observer)obs).Update();
// }
// }
//}
抽象观察者
//interface Observer
//{
// void Update();
//}
具体观察者
//class ConcreteObserver
//{
// public void Update()
// {
// //具体更新代码
// }
//}
#endregion
//实例代码
//指挥部类,充当抽象目标类
abstract class AllyControlCenter
{
protected string allyName;//战队名称
protected List<IObserver> players = new List<IObserver>();//定义一个集合用于存储战队成员
public void SetAllyName(string name)
{
this.allyName = name;
}
public string GetAllyName()
{
return this.allyName;
}
//注册方法
public void Join(IObserver obs)
{
Console.WriteLine("{0}加入{1}战队", obs.Name, this.allyName);
players.Add(obs);
}
//注销方法
public void Quit(IObserver obs)
{
Console.WriteLine("{0}退出{1}战队", obs.Name, this.allyName);
players.Remove(obs);
}
//声明抽象通知方法
public abstract void NotifyOBserver(string name);
}
//具体指挥部类 充当具体目标类
class ConcreteAllyControlCenter : AllyControlCenter
{
public ConcreteAllyControlCenter(string allyName)
{
Console.WriteLine("{0}战队组建成功", allyName);
Console.WriteLine("-------------------------");
this.allyName = allyName;
}
//实现通知方法
public override void NotifyOBserver(string name)
{
Console.WriteLine("{0}战队紧急通知,盟友{1}遭受敌人攻击!", this.allyName, name);
//遍历观察者集合,调用每一个盟友(自己除外)的支援方法
foreach (object obs in players)
{
if (!((IObserver)obs).Name.Equals(name))
{
((IObserver)obs).Help();
}
}
}
}
//抽象观察者类
interface IObserver
{
string Name { get; set; }
void Help(); //声明支援盟友方法
void BeAttacked(AllyControlCenter acc); //声明遭受攻击方法
}
//战队成员类 充当具体观察者类
class Player : IObserver {
private string name;
public Player(string name) {
this.name = name;
}
public string Name {
get { return name; }
set { name = value; }
}
//支援盟友方法的实现
public void Help() {
Console.WriteLine("坚持住,{0}来救你!",this.name);
}
//遭受攻击方法的实现,当遭受到攻击时将调用指挥部类的通知方法NotifyObserver()来通知盟友
public void BeAttacked(AllyControlCenter acc) {
Console.WriteLine("{0}被攻击!",this.name);
acc.NotifyOBserver(name);
}
}
//客户端测试
class Test11 {
public void main() {
//定义观察目标对象
AllyControlCenter acc;
acc = new ConcreteAllyControlCenter("金庸群侠");
//定义四个观察者对象
IObserver player1,player2,player3,player4;
player1 = new Player("杨过");
acc.Join(player1);
player2 = new Player("令狐冲");
acc.Join(player2);
player3 = new Player("张无忌");
acc.Join(player3);
player4 = new Player("段誉");
acc.Join(player4);
//某成员遭受攻击,触发联动
player1.BeAttacked(acc);
//输出
//杨过加入金庸群侠战队!
//令狐冲加入金庸群侠战队!
//张无忌加入金庸群侠战队!
//段誉加入金庸群侠战队!
//杨过被攻击
//金庸群侠战队紧急通知,盟友杨过遭受敌人攻击!
//坚持住,令狐冲来救你
//坚持住,张无忌来救你
//坚持住,段誉来救你
}
}
}