转载:作者:左洸 出处:软件园

这个模式和领导有什么关系吗?有!

在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();
        }

    }

}


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;
            }

        }

    }



}



运行结果如下图:
 



总结:Builder 模式就是一个 Director (指导者)在好几个 Builder(建造者,或者说干活的人)挑选出一个,让他去完成一个任务,同时 Director 给出了完成这个任务的大体思路和框架(要不然怎么叫 Director 呢?),有的情况下也给出一些条件,就像本例子中的黄金和美女。具体这个任务怎么完成就看被选中的那个 Builder 的本事了

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


Copyright © fred