// 引入策略模式,将工作划分开来
// 应用依赖注入,让"执行工作"由注入的实例来完成具体内容.
// 这样,新增的工作独立完成,哪里使用哪里修改
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.那最起码让我有机会找到执行的地方.
// 派生维护难的问题一直困扰着我,如无必要不派生.
// 这里已经看不到委托了,而是衍生出另一种技术-接口.有人把这种应用叫策略,还有人称做服务.
}