您的位置:首页 > 其它

一只水杯引发的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 = "雪碧冰激凌";
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: