今日温习事件与委托,颇感迷惘,运用起来惆怅非常,逛园子时偶得一例,细细拼来,顿觉云开雾散,豁然开朗。不敢独享,呈于圈中供大家品尝。

我们的需求是这样的
某饭店老板让购物员去买菜,要买白菜和土豆,最后算出总价格。
老板说:“白菜的价格如果大于3.5元,就扣除白菜的杂质,扣除方法是 每1公斤减掉0.3公斤的杂质再买”。
购物员:“那土豆也是用这个规则么?”。
老板说:“土豆按什么规则,扣不扣杂质你自己决定”。
购物员暗想:“先去菜市场看看价格如果土豆的价格大于2.5元就扣杂质。。。”。

代码实现如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BuyVegetable
{
    //购买土豆委托
    public delegate double delegateBuyMurphy(double price, double x);

    //买菜类
    public class BuyVegetable
    {
        double CabbageMoney;
        double MurphyMoney;

        // 买白菜方法 
        public void BuyCabbage(double price, double amount)
        {
            //这里老板制定了买白菜的方案
            //如果买白菜的价格小于3,就不去杂,如果大于3去杂
            if (price < 3)
            {
                CabbageMoney = price * amount;
            }
            else
            {
                CabbageMoney = (price - 0.3) * amount;
            }
        }

        //因为只知道要买土豆,具体怎么买现在决定不了,所以只能定一个事件。
        //白话:怎么买得到到了菜市场才能决定,可是无论怎么样都得有买土豆这回事儿,无论到了菜市场怎么决定都离不开“价格”和“数量”这两个条件
        //这里就用到委托了,所以这个事件是委托类型的。 delegateBuyMurphy(委托的定义在下面)
        public event delegateBuyMurphy eventBuyMurphy;
        //所以购买土豆的方法是这样的
        public void BuyMurphy(double price, double amount)
        {
            //这里只知道购买土豆,但是具体用怎么的规则购买,在购买的时候才能决定
            MurphyMoney = eventBuyMurphy(price, amount);
        }
        //计算总金额
        public double Stat()
        {
            return this.CabbageMoney + this.MurphyMoney;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //使用上面的买菜类开始购买
            BuyVegetable buyVegetable = new BuyVegetable();
            //购买白菜,老板制定的死规则不能改直接用这个规则吧。
            buyVegetable.BuyCabbage(3.6, 8);
            //采购员问:土豆多少钱斤啊。
            //售货员说:4.8。
            //采购员说:等会,我先算算怎么买法
            //购物员开始制定买土豆的规则buyVegetable_eventBuyMurphy
            //制定完了,这个规则是买土豆这事儿的,当然得给买土豆这事儿
            buyVegetable.eventBuyMurphy += new delegateBuyMurphy(buyVegetable_eventBuyMurphy);
            //购买土豆
            buyVegetable.BuyMurphy(4.8, 9);
            //计算总价格
            Console.WriteLine(buyVegetable.Stat());
        }

        //购买土豆的规则方法buyVegetable_eventBuyMurphy      
        static double buyVegetable_eventBuyMurphy(double price, double x)
        {
            if (price > 2.5)
            {
                return (price - 0.3) * x;
            }
            else
            {
                return price * x;
            }
        }
    }
}