关闭

牛奶与报纸

426人阅读 评论(1) 收藏 举报

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

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

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

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

    }

}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11876次
    • 积分:243
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:5篇
    • 译文:0篇
    • 评论:2条
    文章分类