无独有偶小菜也一贯想深造设计格局

模板方法情势-从回家过大年提起

  立时将要度岁了,大家都很盼望,回家的艺术有很种种,汽车,火车,船,飞机等,不管如何办法回家,回家过新年就四个经过:买票、回家和家里庆祝。

  举个例子坐火车回家就足以这个写:

永利会娱乐 1永利会娱乐 2

1     public class HapplyPeopleByHuoChe
2     {
3         public void celebrateSpring()
4         {
5             Console.WriteLine("买票....");
6             Console.WriteLine("坐火车....");
7             Console.WriteLine("回家庆祝....");
8         }
9     }

View Code

  然而部分人索要坐高铁,有的人索要坐汽车归家,那大家复制+粘贴校订下:

永利会娱乐 3永利会娱乐 4

1     public class HapplyPeopleByQiChe
2     {
3         public void celebrateSpring()
4         {
5             Console.WriteLine("买票....");
6             Console.WriteLine("坐汽车....");
7             Console.WriteLine("回家庆祝....");
8         }
9     }

View Code

  那样我们就能够意识难点,增添生机勃勃种交通工具,大家将要复制+粘贴下,那样代码就能够变得难以维护和支出,针对这种气象,小编提议了大器晚成种标准:DENCOREY(Don’T
Repeat
Yourself,不要复复制你自己卡塔尔
,至于这种原则的好与坏小编就不演讲了,上边我们这种完成形式的主题材料其实正是代码重用,上面说下模板方法格局的利用。

对象和方式

  尽管一贯是用的面向对象的语言,说真的,小菜真的还未有越来越深档案的次序的垂询对象的概念,只可以稳步储存了,其实如若大家不从编制程序的角度去对待编制程序,就能够发觉其实编制程序只是和经常的消除方案相像,就好像买高铁票,去订票厅能够买,在英特网能够买,那编制程序完成的就是网络购票的这么些进度,和别的艺术达成的法力都以均等把票买到,只是经过不是相近。在这里本书里面,小编详细说了下情势(Pattern卡塔尔的简史,最最早,形式是在建筑行当提议并选取的,到了新生,由Gof四个人帮把形式设计引进到编制程序世界,并收编了贰十六个最常用的设计格局,得以逐步发展强盛。

  情势定义如下:形式是某上下文景况中一个难点的技术方案。

  然则我更爱好小编的概念:形式是某上下文情形中二个难题的“常用”解决方案。

  常用并正确的格局才可以算上的确的形式,用钥匙开门和用榔头撬门都足以进去屋家,但是用锤子撬门进来屋企并不成为生龙活虎种形式。

  GoF为格局定义了4个基本要素:

  •  格局名称(Pattern
    name卡塔尔
  •  问题(Problem)
  •  解决方案(Solution卡塔 尔(英语:State of Qatar)
  •  效果(Consequence)

使用持续

  幸免代码重用,OOP的第一次全国代表大会特色就是继承,既然都以买票、回家和在家庆祝,那大家能够把那三种方式抽象出来,代码如下:

永利会娱乐 5永利会娱乐 6

 1     public abstract class HapplyPeople2
 2     {
 3         protected void BuyTicket()
 4         {
 5             Console.WriteLine("买票....");
 6         }
 7         protected abstract void Travel()
 8         {
 9             //待重写
10         }
11         protected void Happy()
12         {
13             Console.WriteLine("回家庆祝....");
14         }
15     }

View Code

  因为交通形式各异,大家只须求把Travel方法抽象就能够,那样抽象类的落到实处类就必须去落实Travel这几个抽象方法,而无需去落到实处别的的艺术。坐轻轨我们就足以那样达成:

永利会娱乐 7永利会娱乐 8

1     public class HapplyPeopleByHuoChe:HapplyPeople2
2     {
3         protected override void Travel()
4         {
5             Console.WriteLine("坐火车回家....");
6         }
7     }

View Code

  邻相符的,乘机:

永利会娱乐 9永利会娱乐 10

1     public class HapplyPeopleByAir : HapplyPeople2
2     {
3         protected override void Travel()
4         {
5             Console.WriteLine("坐飞机回家....");
6         }
7     }

View Code

  在上边的事例中HapplyPeople2那些类就是模板,其实在付出一些别的东西的时候大家不常候也会用到Template,举例做一些CMS(内容管理体系卡塔 尔(阿拉伯语:قطر‎的时候,因为就那些页面,只是页面包车型客车体制会有所区别,不相同的种类幸好,假设叁个系统用差异的页面样式就比较难办了,当时就能够用到Template,如下:

  永利会娱乐 11

  里面是有个别由此自定义的模版语言创设的模版页面,生成的时候会转接为对应的代码,那样我们就能够三个种类有着区别的体制,只需求在后台切换下,特别常有益。

  其实逐步就能开采方式会接收到此外地方,只要您留神观看,它就在你身边。

引进回调

  言归正传,大家使用模板方法开掘成广大利润,举个例子代码重用、易于扩展、扑灭代码冗余难点等,然而当子类变得越来越多的时候,就能够变得那么不轻巧保证了。举例大家查询数据库的音讯:

  1.  连接Connection对象
  2.  实施查询语句
  3.  处理查询的结果并剖判再次回到结果

  通过上边包车型客车急需大家就足以窥见1和2都以意气风发律的,只是重临结果处理的格局各异,回调区别语言有例外的落实方式,C语言使用函数指针达成,java使用在这之中无名类实现,C#接收委托(delegate卡塔 尔(英语:State of Qatar)达成,因为小编整本书都是用java写的,小编Computer没装java景况,那就用大家了然的C#实现了。

  代码如下:

永利会娱乐 12永利会娱乐 13

 1     /// <summary>
 2     /// 数据库操作类
 3     /// </summary>
 4     public class DbHelperOra
 5     {
 6         public static bool Query(string SQLString, TestTemplete.CallBackDG<DataSet> cb)
 7         {
 8             using (OracleConnection connection = new OracleConnection(""))
 9             {
10                 try
11                 {
12                     //connection.Open();
13                     //OracleDataAdapter command = new OracleDataAdapter(SQLString, connection);
14                     DataSet ds = new DataSet();
15                     //command.Fill(ds, "ds");
16                     return cb(ds);
17                 }
18                 catch (System.Data.OracleClient.OracleException E)
19                 {
20                     connection.Close();
21                     throw new Exception(E.Message);
22                 }
23             }
24         }
25     }

View Code

永利会娱乐 14永利会娱乐 15

 1     /// <summary>
 2     /// 测试
 3     /// </summary>
 4     public class TestTemplete
 5     {
 6         public delegate bool CallBackDG<T>(T param);
 7         public bool Test()
 8         {
 9             return DbHelperOra.Query("testSql", new CallBackDG<DataSet>(CallBackF));
10         }
11         public bool CallBackF(DataSet ds)
12         {
13             if (ds.Tables.Count==0 )
14             {
15                 return false;
16             }
17             if (ds.Tables[0].Rows.Count > 0)
18             {
19                 return true;
20             }
21             else
22             {
23                 return false;
24             }
25         }
26     }

View Code

  示例代码下载:TempleteMethod.rar

前言

设计方式目录:

本篇目录:

  近期在亚马逊(亚马逊(Amazon卡塔 尔(英语:State of Qatar)卡塔 尔(英语:State of Qatar)买了一本《CL陆风X8》的书,那时候搞活动买风姿洒脱送朝气蓬勃,然后挑了一本《漫谈设计形式》,一个人不相识的大咖写的,近期闲来无事,翻了几页瞧了瞧,认为还是不错的,刚巧小菜也一向想上学设计格局,就决定认真的拜读下。

  小菜写博文的指标是整理本身所整理的学识,小菜是多少个欣赏搜聚的人,好的东西作者都爱怜收藏起来,可是写出来正是另贰回事了,一是砥砺自身的表明技术及认识所学的学识,而是分享给急需支援的人。

  另外Tony
Zhao
写的【原】从头学习设计情势深感如故不错,浅显易懂,很适合初读书人。

后记

  骚年们,和菜肴一同收拾学习呢,未完待续。。。

 

相关文章