一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
1.1案例现在有对象:孩子、猫、狗、手机、母亲
现在手机响了->猫叫了一声-> 狗叫了一声->孩子哭了->母亲关闭手机
1.1.1版本代码如下:
public class Baby
{
public void Cry()
{
Console.WriteLine("宝贝哭了...");
}
}
public class Cat
{
public void Miao()
{
Console.WriteLine("猫叫:Miao");
}
}
public class Dog
{
public void Wang()
{
Console.WriteLine("狗:Wang、Wang、Wang....");
}
}
public class Mother
{
public void EmbraceBaby()
{
Console.WriteLine("母亲抱了抱宝宝...");
}
}
public class Phone
{
public void Rings()
{
Console.WriteLine("手机响了");
}
}
private void btnSimple_Click(object sender, EventArgs e)
{
new Phone().Rings();
new Cat().Miao();
new Dog().Wang();
new Baby().Cry();
new Mother().EmbraceBaby();
}
1.1.2版本
我们整理为对象的方式
public abstract class IObserver
{
public abstract void Action();
private List ListObserver = new List();
public void AddObserver(IObserver pObserver)
{
ListObserver.Add(pObserver);
}
public void NotifyAllObservers()
{
foreach (var item in ListObserver)
{
item.Action();
}
}
}
public class Phone: IObserver
{
public void Rings()
{
Console.WriteLine("手机响了");
}
public override void Action()
{
Rings();
}
}
public class Cat : IObserver
{
public void Miao()
{
Console.WriteLine("猫叫:Miao");
}
public override void Action()
{
Miao();
}
}
public class Dog : IObserver
{
public void Wang()
{
Console.WriteLine("狗:Wang、Wang、Wang....");
}
public override void Action()
{
Wang();
}
}
public class Baby: IObserver
{
public void Cry()
{
Console.WriteLine("宝贝哭了...");
}
public override void Action()
{
Cry();
}
}
public class Mother : IObserver
{
public void EmbraceBaby()
{
Console.WriteLine("母亲抱了抱宝宝...");
}
public override void Action()
{
EmbraceBaby();
}
}
private void btnObject_Click(object sender,EventArgs e)
{
Phone pPhone = new Phone();
pPhone.AddObserver(new Cat());
pPhone.AddObserver(new Dog());
pPhone.AddObserver(new Baby());
pPhone.AddObserver(new Mother());
pPhone.Rings();
pPhone.NotifyAllObservers();
}
1.1.3版本
以上版本存在以下问题
- 每一个对象只能符合一个行为,比如:现在将过程改变为:
手机响了->猫叫了一声-> 狗叫了一声->孩子哭了->母亲抱了抱->关闭手机->孩子睡着了->狗去抓老鼠了
以下使用事件实现:
public abstract class IObserver
{
public abstract void Action();
private List ListObserver = new List();
public void AddObserver(IObserver pObserver)
{
ListObserver.Add(pObserver);
}
public void NotifyAllObservers()
{
foreach (var item in ListObserver)
{
item.Action();
}
}
private event Action NotifyAllObserversHandeler;
public void AddObserver(Action pAction)
{
NotifyAllObserversHandeler += pAction;
}
public void RemoveObserver(Action pAction)
{
NotifyAllObserversHandeler -= pAction;
}
public void NotifyAllObserversHandler()
{
NotifyAllObserversHandeler.Invoke();
}
}
public class Phone: IObserver
{
public void Rings()
{
Console.WriteLine("手机响了");
}
public void ClosePhone()
{
Console.WriteLine("关闭手机");
}
public override void Action()
{
Rings();
}
}
public class Baby: IObserver
{
public void Cry()
{
Console.WriteLine("宝贝哭了...");
}
public void Sleep()
{
Console.WriteLine("宝宝睡着了...");
}
public override void Action()
{
Cry();
}
}
public class Cat : IObserver
{
public void Miao()
{
Console.WriteLine("猫叫:Miao");
}
public override void Action()
{
Miao();
}
}
public class Dog : IObserver
{
public void Wang()
{
Console.WriteLine("狗:Wang、Wang、Wang....");
}
public void DogTrying2CatchMice()
{
Console.WriteLine("狗拿耗子");
}
public override void Action()
{
Wang();
}
}
public class Mother : IObserver
{
public void EmbraceBaby()
{
Console.WriteLine("母亲抱了抱宝宝...");
}
public override void Action()
{
EmbraceBaby();
}
}
public class Mother : IObserver
{
public void EmbraceBaby()
{
Console.WriteLine("母亲抱了抱宝宝...");
}
public override void Action()
{
EmbraceBaby();
}
}
2.发布订阅模式
先看观察者模式和发布订阅模式的区别
具体参考链接:https://www.jianshu.com/p/c391c77a8771,
好文章直接用,我不喜欢粘贴,搞得百度出来全部都是…
public static class ServiceInstance3.结语where T:class private static event Action NotifyHandeler; public static void Publish(T tValue) { NotifyHandeler.Invoke(tValue); } public static void Subscribe(Action pAction) { NotifyHandeler += pAction; } public class PhoneRing { } private void btnPublishSubscribe_Click(object sender, EventArgs e) { Phone pPhone = new Phone(); pPhone.Rings(); PhoneRing pPhoneRing = new PhoneRing(); ServiceInstance .Subscribe(new Action ((a) => new Cat().Miao())); ServiceInstance .Subscribe(new Action ((a) => new Dog().Wang())); ServiceInstance .Subscribe(new Action ((a) => new Baby().Cry())); ServiceInstance .Subscribe(new Action ((a) => new Mother().EmbraceBaby())); ServiceInstance .Subscribe(new Action ((a) => new Phone().ClosePhone())); ServiceInstance .Subscribe(new Action ((a) => new Baby().Sleep())); ServiceInstance .Subscribe(new Action ((a) => new Dog().DogTrying2CatchMice())); ServiceInstance .Publish(pPhoneRing); }
其实今天的例子举得不好,有点像责任链,这个只是说当手机响了之后谁要做什么事情…



