前言:我也是初学者,希望大家能提出意见。另外转载请注明作者和出处,毕竟花了快一周的时间才完成。
这个模式和领导有什么关系吗?有!
在Builder 模式中,有一个很重要的类叫做 Director ,他就是领导者,对应我们现实生活中的经理、包工头、国王等等。别小看他,他自己从不干活,只是发号施令,然后交代给自己的手下去干。
那又和艺术有什么关系呢?当然也有!
在Builder 模式中,还有另一些很重要的类叫做 Builder ,他们是专门干活的,经理对应员工们、包工头对应民工们、国王对应大臣们等等。他们在领导眼里每个人都是一样的,就是说同一件事情交给谁干都可以。
这就和艺术扯上关系了,有这么多手下到底选哪一个呢?每个手下都能干活,但是同一件事情交个不同的两个人去干,很可能就会得到不同的结果,请看下面乾隆、和申、纪晓岚的故事......
话说乾隆初年,格尔丹蠢蠢欲动,乾隆为了赢得时间做好战争动员想使个缓兵之计,准备派一名大臣给格尔丹送去黄金万两、美女一名,以示诚意。问题是派谁去呢?手下有两个大臣都可以担当此重任,一名是军机大臣和申,另一个我不说你也知道,当然就是大学士纪晓岚了。对乾隆来说,让谁去都一样,但实际上呢?
场景一,和申当选钦差大臣,私吞黄金和美女,导致战祸。
场景二,纪晓岚当选钦差大臣,把黄金散给了老百姓,把美女送给了格尔丹,格尔丹中计。
下面我们用 C# 来描述这段故事,从中来体会 Builder 模式的内涵。
客户端
using System;
namespace Builder
{
class Client
{
[STAThread]
static void Main(string[] args)
{
King Qianlong = new King();
//派和申为钦差
Qianlong.SelectMinister(new HeShen());
Qianlong.Do();
Qianlong.Result();
Console.WriteLine("============================================");
Console.WriteLine ();
//派纪晓岚为钦差
Qianlong.SelectMinister(new Jixiaolan());
Qianlong.Do();
Qianlong.Result();
Console.Read();
}
}
}
namespace Builder
{
class Client
{
[STAThread]
static void Main(string[] args)
{
King Qianlong = new King();
//派和申为钦差
Qianlong.SelectMinister(new HeShen());
Qianlong.Do();
Qianlong.Result();
Console.WriteLine("============================================");
Console.WriteLine ();
//派纪晓岚为钦差
Qianlong.SelectMinister(new Jixiaolan());
Qianlong.Do();
Qianlong.Result();
Console.Read();
}
}
}
Builder 模式类
using System;
namespace Builder
{
/// <summary>
/// 发号施令的家伙,皇帝
/// 顺便说一下,皇帝可不好当呀,重用哪个大臣可关系的江山社稷的安危呀!
/// </summary>
public class King
{
private Minister minister;
public King()
{
}
//选择一个大臣
public void SelectMinister(Minister minister)
{
this.minister=minister;
}
//给大臣交待任务,让大臣干活
//注意:在皇帝眼里,所有大臣都是一样的
//这个活只要是大臣都能干,我去都行,但是干出来的结果可不一样
public void Do()
{
Console.WriteLine("圣旨:派{0}为钦差大臣出使蒙古,为格尔丹送去黄金和美女!",minister.Name);
Console.WriteLine();
minister.DeliverGold(10000);
minister.DeliverPrincess("兰齐儿格格");
}
//让大臣汇报一下情况吧
public void Result()
{
Console.WriteLine(minister.Result());
Console.WriteLine();
Console.WriteLine();
}
}
/// <summary>
/// 抽象的大臣
/// </summary>
public interface Minister
{
string Name
{
get;
}
//护送黄金
void DeliverGold(int i);
//护送美女公主
void DeliverPrincess(string name);
//向皇帝汇报情况
string Result();
}
/// <summary>
/// 具体的大臣:和申
/// </summary>
public class HeShen:Minister
{
private string name="军机大臣和申";
public void DeliverGold(int i)
{
Console.WriteLine("和申收到黄金一万两以后.");
Console.WriteLine();
Console.WriteLine("和申:黄金{0}两啊,我一辈子也挣不来阿,他妈的,一不做二不休!",i);
Console.WriteLine("和申:来人啊,把这些金子全部放到我的仓库里去,换成500两白银送给格尔丹");
Console.WriteLine();
}
public void DeliverPrincess(string name)
{
Console.WriteLine("和申收到美女一名以后.");
Console.WriteLine();
Console.WriteLine("和申:{0}真是美若天仙呀,这样的美人送给格尔丹岂不是糟蹋了!",name);
Console.WriteLine("和申:这样吧,把{0}留下做我的九姨太,让三姨太冒充格格送给格尔丹不就行了,嘿嘿!",name);
Console.WriteLine();
}
public string Result()
{
string result="和申又发了一笔,大清国和格尔丹开战战败,清朝灭亡!";
return result;
}
public string Name
{
get
{
return this.name;
}
}
}
/// <summary>
/// 具体的大臣:纪晓岚
/// </summary>
public class Jixiaolan:Minister
{
private string name="大学士纪晓岚";
public void DeliverGold(int i)
{
Console.WriteLine("纪晓岚收到黄金一万两以后.");
Console.WriteLine();
Console.WriteLine("纪晓岚:黄金{0}两啊,多少老百姓的血汗呀!",i);
Console.WriteLine("纪晓岚:来人啊,把这些金子拿出一半来分给老百姓,剩下的给格尔丹!");
Console.WriteLine();
}
public void DeliverPrincess(string name)
{
Console.WriteLine("纪晓岚收到美女一名以后.");
Console.WriteLine();
Console.WriteLine("纪晓岚:{0}是金枝玉叶,一路上千万要小心呀!!",name);
Console.WriteLine("纪晓岚:终于到达蒙古国,格尔丹见到美女很高兴,连钱都不要了,我的任务完成了!");
Console.WriteLine();
}
public string Result()
{
string result="纪晓岚顺利完成任务,大清国赢得了准备时间,消灭了格尔丹!";
return result;
}
public string Name
{
get
{
return this.name;
}
}
}
}
namespace Builder
{
/// <summary>
/// 发号施令的家伙,皇帝
/// 顺便说一下,皇帝可不好当呀,重用哪个大臣可关系的江山社稷的安危呀!
/// </summary>
public class King
{
private Minister minister;
public King()
{
}
//选择一个大臣
public void SelectMinister(Minister minister)
{
this.minister=minister;
}
//给大臣交待任务,让大臣干活
//注意:在皇帝眼里,所有大臣都是一样的
//这个活只要是大臣都能干,我去都行,但是干出来的结果可不一样
public void Do()
{
Console.WriteLine("圣旨:派{0}为钦差大臣出使蒙古,为格尔丹送去黄金和美女!",minister.Name);
Console.WriteLine();
minister.DeliverGold(10000);
minister.DeliverPrincess("兰齐儿格格");
}
//让大臣汇报一下情况吧
public void Result()
{
Console.WriteLine(minister.Result());
Console.WriteLine();
Console.WriteLine();
}
}
/// <summary>
/// 抽象的大臣
/// </summary>
public interface Minister
{
string Name
{
get;
}
//护送黄金
void DeliverGold(int i);
//护送美女公主
void DeliverPrincess(string name);
//向皇帝汇报情况
string Result();
}
/// <summary>
/// 具体的大臣:和申
/// </summary>
public class HeShen:Minister
{
private string name="军机大臣和申";
public void DeliverGold(int i)
{
Console.WriteLine("和申收到黄金一万两以后.");
Console.WriteLine();
Console.WriteLine("和申:黄金{0}两啊,我一辈子也挣不来阿,他妈的,一不做二不休!",i);
Console.WriteLine("和申:来人啊,把这些金子全部放到我的仓库里去,换成500两白银送给格尔丹");
Console.WriteLine();
}
public void DeliverPrincess(string name)
{
Console.WriteLine("和申收到美女一名以后.");
Console.WriteLine();
Console.WriteLine("和申:{0}真是美若天仙呀,这样的美人送给格尔丹岂不是糟蹋了!",name);
Console.WriteLine("和申:这样吧,把{0}留下做我的九姨太,让三姨太冒充格格送给格尔丹不就行了,嘿嘿!",name);
Console.WriteLine();
}
public string Result()
{
string result="和申又发了一笔,大清国和格尔丹开战战败,清朝灭亡!";
return result;
}
public string Name
{
get
{
return this.name;
}
}
}
/// <summary>
/// 具体的大臣:纪晓岚
/// </summary>
public class Jixiaolan:Minister
{
private string name="大学士纪晓岚";
public void DeliverGold(int i)
{
Console.WriteLine("纪晓岚收到黄金一万两以后.");
Console.WriteLine();
Console.WriteLine("纪晓岚:黄金{0}两啊,多少老百姓的血汗呀!",i);
Console.WriteLine("纪晓岚:来人啊,把这些金子拿出一半来分给老百姓,剩下的给格尔丹!");
Console.WriteLine();
}
public void DeliverPrincess(string name)
{
Console.WriteLine("纪晓岚收到美女一名以后.");
Console.WriteLine();
Console.WriteLine("纪晓岚:{0}是金枝玉叶,一路上千万要小心呀!!",name);
Console.WriteLine("纪晓岚:终于到达蒙古国,格尔丹见到美女很高兴,连钱都不要了,我的任务完成了!");
Console.WriteLine();
}
public string Result()
{
string result="纪晓岚顺利完成任务,大清国赢得了准备时间,消灭了格尔丹!";
return result;
}
public string Name
{
get
{
return this.name;
}
}
}
}
运行结果如下图:
总结:Builder 模式就是一个 Director (指导者)在好几个 Builder(建造者,或者说干活的人)挑选出一个,让他去完成一个任务,同时 Director 给出了完成这个任务的大体思路和框架(要不然怎么叫 Director 呢?),有的情况下也给出一些条件,就像本例子中的黄金和美女。具体这个任务怎么完成就看被选中的那个 Builder 的本事了!