一只水杯引发的delegate
2008-04-13 22:22
225 查看
大家都有杯子吧!是否想过使用杯子的流程呢。
一般是:
1 找出杯子;
2 放入某些固体物,比如茶叶、咖啡。当然如果只是想喝水的话这步就省了;
3 往杯子里倒水 - 冷的热的或不冷不热的 - 也许还要搅拌一下;
4 接下来就可以享用了;
5 最后收拾一下杯子。(特别懒的人直接鄙视加无视。)
如果我们站在“使用杯子”的角度把这个流程封装成一个类,显然会遇到一个问题,那就是第二第三步其实是不确定的。如果把杯子里的“固态物”和“液体”看作两个参数的话,其后产生的流程是不确定的。例如,咖啡+热水,一般还要搅拌下,而凉白开直接喝就是了。所以想在这个类里就定义好步骤2和3的全部具体实现的话几乎是不可能的。这种情况下我们该怎么办呢?
一个可行的办法就是在类里定义代理,具体实现交给客户代码就行了。
假设规定往杯子里最多加一种液体并且最多加一种固体,那么不确定的那些步骤就可以抽象成一个确定的代理(只要返回值和参数都一样,就可以用代理):
public delegate void PrepareDrinkingHandler(string water, string mainThing)
接下来定义代表这个代理的函数:
public PrepareDrinkingHandler PrepareDrinking;
这样整个流程可以简化成:
public void Execute()
{
MessageBox.Show("取出杯子");
PrepareDrinking(_water, _mainThing);
MessageBox.Show("享用中... ^_^");
MessageBox.Show("清洗并放归原位");
}
如此,设计类的时候根本就不需要知道用户会冲泡成什么饮料,也不必关心冲泡的过程是怎样的。唯一的要求就是准备饮料的函数必须有两个string参数,并且返回值是void。(符合代理申明)
以下便是源代码。
类 I_Want_To_Drink:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace CupDemo
{
class I_Want_To_Drink
{
#region 私有字段
/// <summary>
/// 液体
/// </summary>
private string _water = "";
/// <summary>
/// 主料
/// </summary>
private string _mainThing = "";
#endregion
#region 定义代理
public delegate void PrepareDrinkingHandler(string water, string mainThing);
public PrepareDrinkingHandler PrepareDrinking = null;
#endregion
#region 公共方法
/// <summary>
/// 构造函数
/// 传参数给类
/// </summary>
/// <param name="water"></param>
/// <param name="other"></param>
public I_Want_To_Drink(string water, string mainThing)
{
_water = water;
_mainThing = mainThing;
}
/// <summary>
/// 执行整个流程
/// </summary>
public void Execute()
{
MessageBox.Show("取出杯子");
PrepareDrinking(_water, _mainThing);
MessageBox.Show("享用中... ^_^");
MessageBox.Show("清洗并放归原位");
}
#endregion
}
}
窗体:
放三个Button,取名button1 - button3。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace CupDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//=======================================================
private void button1_Click(object sender, EventArgs e)
{
I_Want_To_Drink wantDrink = new I_Want_To_Drink("凉白开", "");
wantDrink.PrepareDrinking += new I_Want_To_Drink.PrepareDrinkingHandler(WantWaterOnly);
wantDrink.Execute();
}
private void button2_Click(object sender, EventArgs e)
{
I_Want_To_Drink wantDrink = new I_Want_To_Drink("热水", "纯咖啡");
wantDrink.PrepareDrinking += new I_Want_To_Drink.PrepareDrinkingHandler(WantCofficeOnly);
wantDrink.Execute();
}
private void button3_Click(object sender, EventArgs e)
{
I_Want_To_Drink wantDrink = new I_Want_To_Drink("雪碧", "香草冰激淋");
wantDrink.PrepareDrinking += new I_Want_To_Drink.PrepareDrinkingHandler(WantMore);
wantDrink.Execute();
}
//=======================================================
private void WantCofficeOnly(string water, string mainThing)
{
MessageBox.Show("放" + mainThing);
MessageBox.Show("放" + water);
MessageBox.Show("搅拌均匀");
}
private void WantWaterOnly(string water, string mainThing)
{
MessageBox.Show("放满一杯" + water);
}
private void WantMore(string water, string mainThing)
{
MessageBox.Show("放入适量" + mainThing);
MessageBox.Show("倒入碳酸气充足的" + water);
MessageBox.Show("我爱泡沫!!");
}
//=======================================================
private void Form1_Load(object sender, EventArgs e)
{
button1.Text = "凉白开";
button2.Text = "咖啡";
button3.Text = "雪碧冰激凌";
}
}
}
一般是:
1 找出杯子;
2 放入某些固体物,比如茶叶、咖啡。当然如果只是想喝水的话这步就省了;
3 往杯子里倒水 - 冷的热的或不冷不热的 - 也许还要搅拌一下;
4 接下来就可以享用了;
5 最后收拾一下杯子。(特别懒的人直接鄙视加无视。)
如果我们站在“使用杯子”的角度把这个流程封装成一个类,显然会遇到一个问题,那就是第二第三步其实是不确定的。如果把杯子里的“固态物”和“液体”看作两个参数的话,其后产生的流程是不确定的。例如,咖啡+热水,一般还要搅拌下,而凉白开直接喝就是了。所以想在这个类里就定义好步骤2和3的全部具体实现的话几乎是不可能的。这种情况下我们该怎么办呢?
一个可行的办法就是在类里定义代理,具体实现交给客户代码就行了。
假设规定往杯子里最多加一种液体并且最多加一种固体,那么不确定的那些步骤就可以抽象成一个确定的代理(只要返回值和参数都一样,就可以用代理):
public delegate void PrepareDrinkingHandler(string water, string mainThing)
接下来定义代表这个代理的函数:
public PrepareDrinkingHandler PrepareDrinking;
这样整个流程可以简化成:
public void Execute()
{
MessageBox.Show("取出杯子");
PrepareDrinking(_water, _mainThing);
MessageBox.Show("享用中... ^_^");
MessageBox.Show("清洗并放归原位");
}
如此,设计类的时候根本就不需要知道用户会冲泡成什么饮料,也不必关心冲泡的过程是怎样的。唯一的要求就是准备饮料的函数必须有两个string参数,并且返回值是void。(符合代理申明)
以下便是源代码。
类 I_Want_To_Drink:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace CupDemo
{
class I_Want_To_Drink
{
#region 私有字段
/// <summary>
/// 液体
/// </summary>
private string _water = "";
/// <summary>
/// 主料
/// </summary>
private string _mainThing = "";
#endregion
#region 定义代理
public delegate void PrepareDrinkingHandler(string water, string mainThing);
public PrepareDrinkingHandler PrepareDrinking = null;
#endregion
#region 公共方法
/// <summary>
/// 构造函数
/// 传参数给类
/// </summary>
/// <param name="water"></param>
/// <param name="other"></param>
public I_Want_To_Drink(string water, string mainThing)
{
_water = water;
_mainThing = mainThing;
}
/// <summary>
/// 执行整个流程
/// </summary>
public void Execute()
{
MessageBox.Show("取出杯子");
PrepareDrinking(_water, _mainThing);
MessageBox.Show("享用中... ^_^");
MessageBox.Show("清洗并放归原位");
}
#endregion
}
}
窗体:
放三个Button,取名button1 - button3。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace CupDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//=======================================================
private void button1_Click(object sender, EventArgs e)
{
I_Want_To_Drink wantDrink = new I_Want_To_Drink("凉白开", "");
wantDrink.PrepareDrinking += new I_Want_To_Drink.PrepareDrinkingHandler(WantWaterOnly);
wantDrink.Execute();
}
private void button2_Click(object sender, EventArgs e)
{
I_Want_To_Drink wantDrink = new I_Want_To_Drink("热水", "纯咖啡");
wantDrink.PrepareDrinking += new I_Want_To_Drink.PrepareDrinkingHandler(WantCofficeOnly);
wantDrink.Execute();
}
private void button3_Click(object sender, EventArgs e)
{
I_Want_To_Drink wantDrink = new I_Want_To_Drink("雪碧", "香草冰激淋");
wantDrink.PrepareDrinking += new I_Want_To_Drink.PrepareDrinkingHandler(WantMore);
wantDrink.Execute();
}
//=======================================================
private void WantCofficeOnly(string water, string mainThing)
{
MessageBox.Show("放" + mainThing);
MessageBox.Show("放" + water);
MessageBox.Show("搅拌均匀");
}
private void WantWaterOnly(string water, string mainThing)
{
MessageBox.Show("放满一杯" + water);
}
private void WantMore(string water, string mainThing)
{
MessageBox.Show("放入适量" + mainThing);
MessageBox.Show("倒入碳酸气充足的" + water);
MessageBox.Show("我爱泡沫!!");
}
//=======================================================
private void Form1_Load(object sender, EventArgs e)
{
button1.Text = "凉白开";
button2.Text = "咖啡";
button3.Text = "雪碧冰激凌";
}
}
}
相关文章推荐
- 一只华南虎引发的蝴蝶效应
- 前阿里高管“下海”创业,做了一只全球卖断货的“水杯”
- 一只祼奔的公鸡引发的行业大讨论………
- 一只“小鸟”(Twitter)引发的网络社交战争
- “一只土鸡”引发的纠纷,让我决定不能嫁给这个男人
- iOS一个'initWithRequest:delegate:' is deprecated: first deprecated in iOS 9.0 - Use NSURLSession (see NSURLSession.h) Warning引发的思考
- 一只手表引发的经济危机【转贴】
- 一只老虎引发的联想
- 一只后腿引发的扯淡
- 2017-10-02(一个水杯引发的思考)
- DNS解析引发的问题
- iOS APPDelegate中方法详解
- (Android) Eclipse "launching delegate" 停在 27%的解决方法
- win8更新引发的问题
- jQuery的事件处理方法介绍 - bind(),live(),delegate(),on()
- rails delegate机制
- Silverlight DataGrid点击行(或选择行)引发的事件
- 【Linux】由telnet实验引发的安装Apache问题
- 关于C#中delegate的一个很好的诠释
- 一个电风扇引发的思考