C#委托本质探索 八、引入策略模式

// 引入策略模式,将工作划分开来
// 应用依赖注入,让"执行工作"由注入的实例来完成具体内容.
// 这样,新增的工作独立完成,哪里使用哪里修改
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1.EighthTest
{
    class EighthTest
    {
        public void DoTest()
        {
            员工 小薇 = new 员工();

            小薇.工作 = new 运营魔兽世界();
            小薇.执行工作();
            Console.ReadLine();

            小薇.工作 = new 处理业内竞争();
            小薇.执行工作();
        }
    }

    class 员工
    {
        public 工作策略 工作;

        public void 执行工作()
        {
            Console.WriteLine(工作.执行());
        }

    }

    interface 工作策略
    {
        string 执行();
    }

    class 运营魔兽世界 : 工作策略
    {
        string ConsoleApplication1.EighthTest.工作策略.执行()
        {
            StringBuilder 工作内容 = new StringBuilder();
            工作内容.AppendLine("安排设备采购");
            工作内容.AppendLine("招募客服,上岗培训");
            工作内容.AppendLine("广告宣传");
            工作内容.AppendLine("游戏上市");
            工作内容.AppendLine("推出活动");
            工作内容.AppendLine("…………");
            return 工作内容.ToString();
        }
    }

    class 处理业内竞争 : 工作策略
    {
        string ConsoleApplication1.EighthTest.工作策略.执行()
        {
           
            StringBuilder 工作内容 = new StringBuilder();
            工作内容.AppendLine("调查竞争对手");
            工作内容.AppendLine("展开斗争");
            return 工作内容.ToString();
        }
    }

    // 这个设计做出来似乎很高明,但曾经发生的一件事导致我多年来一直厌恶派生的东西.
    // 一次去现场,给别人开发的项目做维护,发现程序中出现错误,需要修改.
    // 触发错误的表现很简单,点一个按钮报错.我就从这个按钮的Click事件中向下查找.
    // 以这个例子来说,在测试代码中右击"小薇.工作",选择转到定义,根本跳转不到真正执行的地方.
    // 那个程序别人几乎无法维护,简单的一个窗体,却附带了几个.cs,一个向表中添加记录的操作,
    // 你却怎么也找不到Insert into语句在哪里.
    // 所以,如果用了派生技术,必须要写好设计说明.
    // 不然我宁愿看到很长的if...else.那最起码让我有机会找到执行的地方.
    // 派生维护难的问题一直困扰着我,如无必要不派生.

    // 这里已经看不到委托了,而是衍生出另一种技术-接口.有人把这种应用叫策略,还有人称做服务.
}

posted @ 2011-07-11 16:06  规定  阅读(377)  评论(0编辑  收藏  举报