牛奶与报纸
来源:互联网 发布:大学生就业难数据 编辑:程序博客网 时间:2024/04/25 09:08
上次听俞晖老师讲委托与事件的时候引用了一个牛奶与报纸的故事,对理解委托比较有用, 分享一下。
先来看看利用接口的实现:
定义两个接口用于报纸、牛奶,然后订阅者继承这个接口这里我们看看利用接口实现存在的问题:不能达到箱子的共享,每个接口都只能实现特定功能。
public interface IMilkBox
......{
void PutMilkIn(string s);
}
public interface INewsPaperBox
......{
void PutNewsPaperIn(string s);
}
public class Subscriber : INewsPaperBox, IMilkBox
......{
public string name;
public Subscriber(string name)
......{
this.name = name;
}
public void PutNewsPaperIn(string s)
......{
Console.WriteLine("{0}在报箱里收到送来的{1}", name, s);
}
public void PutMilkIn(string s)
......{
Console.WriteLine("{0}在奶箱里收到送来的{1}", name, s);
}
}
public class NewsPaperSender
......{
//接口实现
protected ArrayList subscribers = new ArrayList();
public void SendNewsPaper()
......{
foreach (INewsPaperBox newsPaperBox in subscribers)
newsPaperBox.PutNewsPaperIn("报纸");
}
public void Subscribe(INewsPaperBox newsPaperBox)
......{
subscribers.Add(newsPaperBox);
}
}
public class MilkSender
......{
//接口实现
protected ArrayList subscribers = new ArrayList();
public void SendMilk()
......{
foreach (IMilkBox milkBox in subscribers)
milkBox.PutMilkIn("牛奶");
}
public void Subscribe(IMilkBox milkBox)
......{
subscribers.Add(milkBox);
}
}
//功能的实现
public static void Main( string[] args )
......{
//接口实现
MilkSender ms = new MilkSender();
NewsPaperSender nps = new NewsPaperSender();
Subscriber s1 = new Subscriber("张三");
Subscriber s2 = new Subscriber("李四");
Subscriber s3 = new Subscriber("王五");
ms.Subscribe(s1);
ms.Subscribe(s2);
nps.Subscribe(s2);
nps.Subscribe(s3);
ms.SendMilk();
nps.SendNewsPaper();
}
......{
void PutMilkIn(string s);
}
public interface INewsPaperBox
......{
void PutNewsPaperIn(string s);
}
public class Subscriber : INewsPaperBox, IMilkBox
......{
public string name;
public Subscriber(string name)
......{
this.name = name;
}
public void PutNewsPaperIn(string s)
......{
Console.WriteLine("{0}在报箱里收到送来的{1}", name, s);
}
public void PutMilkIn(string s)
......{
Console.WriteLine("{0}在奶箱里收到送来的{1}", name, s);
}
}
public class NewsPaperSender
......{
//接口实现
protected ArrayList subscribers = new ArrayList();
public void SendNewsPaper()
......{
foreach (INewsPaperBox newsPaperBox in subscribers)
newsPaperBox.PutNewsPaperIn("报纸");
}
public void Subscribe(INewsPaperBox newsPaperBox)
......{
subscribers.Add(newsPaperBox);
}
}
public class MilkSender
......{
//接口实现
protected ArrayList subscribers = new ArrayList();
public void SendMilk()
......{
foreach (IMilkBox milkBox in subscribers)
milkBox.PutMilkIn("牛奶");
}
public void Subscribe(IMilkBox milkBox)
......{
subscribers.Add(milkBox);
}
}
//功能的实现
public static void Main( string[] args )
......{
//接口实现
MilkSender ms = new MilkSender();
NewsPaperSender nps = new NewsPaperSender();
Subscriber s1 = new Subscriber("张三");
Subscriber s2 = new Subscriber("李四");
Subscriber s3 = new Subscriber("王五");
ms.Subscribe(s1);
ms.Subscribe(s2);
nps.Subscribe(s2);
nps.Subscribe(s3);
ms.SendMilk();
nps.SendNewsPaper();
}
再看看利用委托实现牛奶和报纸的订阅来解决上面的问题:使用委托让牛奶报纸共享箱子。
namespace myDelegate
...{
public delegate void SendableDelegate(string s);
public class Subscriber
...{
public string name;
public Subscriber(string name)
...{
this.name = name;
}
public void PutNewsPaperIn(string s)
...{
Console.WriteLine("{0}在报箱里收到送来的{1}", name, s);
}
public void PutMilkIn(string s)
...{
Console.WriteLine("{0}在奶箱里收到送来的{1}", name, s);
}
}
public class NewsPaperSender
...{
//委托实现
public event SendableDelegate SendNewsPaperHandler;
public void SendNewsPaper()
...{
if (SendNewsPaperHandler != null)
SendNewsPaperHandler("报纸");
}
public void Subscribe(SendableDelegate sd)
...{
SendNewsPaperHandler += sd;
}
}
public class MilkSender
...{
//委托实现
public event SendableDelegate SendMilkHandler;
public void SendMilk()
...{
if (SendMilkHandler != null)
SendMilkHandler("牛奶"); //事件调用时带参数
}
public void Subscribe(SendableDelegate sd)
...{
SendMilkHandler += sd;
}
}
//功能的实现
public class Client
...{
public static void Main( string[] args )
...{
//委托实现
MilkSender ms = new MilkSender();
NewsPaperSender nps = new NewsPaperSender();
Subscriber s1 = new Subscriber("张三");
Subscriber s2 = new Subscriber("李四");
Subscriber s3 = new Subscriber("王五");
ms.Subscribe(new SendableDelegate(s1.PutMilkIn));
ms.Subscribe(new SendableDelegate(s2.PutMilkIn));
nps.Subscribe(new SendableDelegate(s2.PutNewsPaperIn));
nps.Subscribe(new SendableDelegate(s3.PutMilkIn));
ms.SendMilk();
nps.SendNewsPaper();
}
}
}
...{
public delegate void SendableDelegate(string s);
public class Subscriber
...{
public string name;
public Subscriber(string name)
...{
this.name = name;
}
public void PutNewsPaperIn(string s)
...{
Console.WriteLine("{0}在报箱里收到送来的{1}", name, s);
}
public void PutMilkIn(string s)
...{
Console.WriteLine("{0}在奶箱里收到送来的{1}", name, s);
}
}
public class NewsPaperSender
...{
//委托实现
public event SendableDelegate SendNewsPaperHandler;
public void SendNewsPaper()
...{
if (SendNewsPaperHandler != null)
SendNewsPaperHandler("报纸");
}
public void Subscribe(SendableDelegate sd)
...{
SendNewsPaperHandler += sd;
}
}
public class MilkSender
...{
//委托实现
public event SendableDelegate SendMilkHandler;
public void SendMilk()
...{
if (SendMilkHandler != null)
SendMilkHandler("牛奶"); //事件调用时带参数
}
public void Subscribe(SendableDelegate sd)
...{
SendMilkHandler += sd;
}
}
//功能的实现
public class Client
...{
public static void Main( string[] args )
...{
//委托实现
MilkSender ms = new MilkSender();
NewsPaperSender nps = new NewsPaperSender();
Subscriber s1 = new Subscriber("张三");
Subscriber s2 = new Subscriber("李四");
Subscriber s3 = new Subscriber("王五");
ms.Subscribe(new SendableDelegate(s1.PutMilkIn));
ms.Subscribe(new SendableDelegate(s2.PutMilkIn));
nps.Subscribe(new SendableDelegate(s2.PutNewsPaperIn));
nps.Subscribe(new SendableDelegate(s3.PutMilkIn));
ms.SendMilk();
nps.SendNewsPaper();
}
}
}
- 牛奶与报纸
- 牛奶报纸问题(接口实现)
- 牛奶报纸问题(委托实现)
- 一瓶牛奶和一张报纸引发的 “ 委托 ” 事件
- ..牛奶..
- 牛奶
- 男人饮牛奶与女人饮豆浆
- [管理]寓言:三只小青蛙与牛奶桶
- 【腾讯】报纸与信件的字符匹配效率问题
- 报纸查阅
- 报纸页数
- 报纸问题
- 报纸页数
- 报纸传媒
- 酸奶与牛奶哪个更容易使人发胖
- C++搜索与回溯算法之母亲的牛奶
- 【JS】数组和对象就像是书与报纸的关系
- 午夜。。。。牛奶
- 学会宽容
- 宽容是一种修养
- 学会宽容您的世界会很美丽
- div+css使用OPTGROUP对SELECT中的OPTION分组
- 近日连续遭遇病毒
- 牛奶与报纸
- 我学会了宽容
- 异步回调与多播
- String与StringBuilder的区别
- DataSet vs Custom Entities
- uCLinux启动时脚本/bin/expand /etc/ramfs.img /dev/ram0 执行错误
- 在Windows Server 2003上面安装罗技鼠标驱动
- Java学习:IO(1)
- flash读取外部txt文件