• 建造者模式-Builder Pattern



    声明:引自http://myqiao.cnblogs.com/archive/2005/07/30/203438.html#203618


    建造者模式-Builder Pattern -领导者艺术-乾隆、和申、纪晓岚的故事
    前言:我也是初学者,希望大家能提出意见。另外转载请注明作者和出处,毕竟花了快一周的时间才完成。

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

    在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 的本事了!

  • 相关阅读:
    log4j 配置
    membership数据库的架构
    JQuery常用方法一览
    标准http状态码[英文注释版本]
    PowerDesigner教程系列(一)概念数据模型
    ASP.NET配置文件Web.config 详细解释
    C# 特性(Attribute)
    [原创]bind DNS IP列表的精确获取
    【原创】WEP 密码破解
    【收录】Nginx 状态监控
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/665296.html
Copyright © 2020-2023  润新知