牛奶与报纸

原创 2007年10月01日 16:11:00

上次听俞晖老师讲委托与事件的时候引用了一个牛奶与报纸的故事,对理解委托比较有用, 分享一下。  

先来看看利用接口的实现:

定义两个接口用于报纸、牛奶,然后订阅者继承这个接口这里我们看看利用接口实现存在的问题:不能达到箱子的共享,每个接口都只能实现特定功能。
 

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();
}

再看看利用委托实现牛奶和报纸的订阅来解决上面的问题:使用委托让牛奶报纸共享箱子。

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();        
        }

    }

}

一瓶牛奶和一张报纸引发的 “ 委托 ” 事件

委托的定义 (What)  A delegate declaration defines a reference type that can be used to encapsulate a meth...
  • JINGWUMEN22
  • JINGWUMEN22
  • 2008年04月05日 16:50
  • 482

牛奶报纸问题(委托实现)

在这个服务为上的社会里面,怎么可能有“强权”的存在?再看看利用委托实现牛奶和报纸的订阅来解决上面的问题:使用委托让牛奶报纸共享箱子。 using System; namespace...
  • xypqq2006
  • xypqq2006
  • 2012年09月21日 21:21
  • 279

牛奶报纸问题(接口实现)

前几天听了俞晖老师的课,里面讲到一个牛奶与报纸的故事,对理解委托比较有用, 分享一下。   先来看看利用接口的实现: 定义两个接口用于报纸、牛奶,然后订阅者继承这个接口这里我们看看利用接口...
  • xypqq2006
  • xypqq2006
  • 2012年09月21日 21:18
  • 307

html+css报纸排版中的那些事

由于html标签太多,很多不一定会用到,因而容易忘记。但是也有很多在有特定功能的网页布局中用得比较频繁,就拿之前写的一个报纸排版来说吧,有些标签需要经常用到,所以我把它们做了一个总结。下面,我们一起来...
  • xiaoxixi_blog
  • xiaoxixi_blog
  • 2016年04月08日 17:42
  • 451

网络不能代替报纸的N个理由

1、网络需要电,你可以点蜡烛看报,但不可能点蜡烛上网;2、报纸的质感是网络无法提供的;3、报纸随时看随时买,看完可以随时扔,你能把电脑扔了?4、电脑有辐射,对皮肤不好;5、网络上流传着病毒,中了很可能...
  • unimoon
  • unimoon
  • 2006年08月28日 20:34
  • 2221

任务六:通过HTML及CSS模拟报纸排版

网页预览效果:http://zhulf.com/baiduweb/xw/task6/ HTML代码: 小薇学院task6 ife.baidu.com...
  • zhulf0804
  • zhulf0804
  • 2017年04月02日 00:38
  • 559

P1208 [USACO1.3]混合牛奶 Mixing Milk

题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助Marry乳业找到最优的牛奶采购方案。 Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价...
  • zqwang
  • zqwang
  • 2016年10月22日 17:02
  • 348

全球最具影响力十大报纸

1、美国《华尔街日报》 (The Wall Street Journal)是美国乃至全世界影响力最大,侧重金融、商业领域报导的日报,创办于1889年。        英文官网 http://w...
  • silentwolfyh
  • silentwolfyh
  • 2016年11月02日 09:07
  • 2768

报纸页数,2016蓝桥杯试题,第一题

一、 试题 1报纸页数 X星球日报和我们地球的城市早报是一样的, 都是一些单独的纸张叠在一起而已。每张纸印有4版。比如,某张报纸包含的4页是:5,6,11,12,可以确定它应该是最上边的第2张报纸...
  • he__yuan
  • he__yuan
  • 2017年03月14日 22:18
  • 655

第七届蓝桥杯软件类省赛真题-C-C-1_报纸页数

//第七届蓝桥杯软件类省赛真题-C-C-1_报纸页数 /* 报纸页数 X星球日报和我们地球的城市早报是一样的, 都是一些单独的纸张叠在一起而已。每张纸印有4版。 比如,某张报纸包含的4页是:5,6...
  • Chen_Tongsheng
  • Chen_Tongsheng
  • 2017年03月02日 16:24
  • 428
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:牛奶与报纸
举报原因:
原因补充:

(最多只允许输入30个字)