95992828九五至尊2

菜肴学习设计形式,模板方法

四月 10th, 2019  |  882828九五至尊手机版

前言

设计格局目录:

本篇目录:

  前段时间在亚马逊(亚马逊)买了1本《CL冠道》的书,当时搞活动买1送一,然后挑了一本《漫谈设计形式》,壹个人不相识的大牌写的,这几天闲来无事,翻了几页瞧了瞧,感觉仍旧不错的,正好小菜也直接想上学设计形式,就控制认真的拜读下。

  小菜写博文的目标是收十自身所整理的知识,小菜是二个喜爱收集的人,好的东西我都开心收藏起来,不过写出来正是另二回事了,一是久经考验自个儿的表达能力及认知所学的知识,而是分享给须要扶助的人。

  另外Tony
Zhao
写的【原】从头学习设计方式备感依旧不错,浅显易懂,很合乎初大家。

前言

设计情势目录:

本篇目录:

  前段时间在亚马逊(亚马逊)买了1本《CLCRUISER》的书,当时搞活动买1送壹,然后挑了一本《漫谈设计情势》,一人不相识的大咖写的,这几天闲来无事,翻了几页瞧了瞧,感觉照旧不错的,正好小菜也直接想深造设计格局,就决定认真的拜读下。

  小菜写博文的目标是收十本身所整理的学问,小菜是2个欣赏收集的人,好的东西笔者都喜爱收藏起来,不过写出来就是另二回事了,一是锤炼自个儿的表明能力及认知所学的学问,而是分享给须要支援的人。

  另外Tony
Zhao
写的【原】从头学习设计格局深感依然不错,浅显易懂,很符合初专家。

指标和方式

  尽管一贯是用的面向对象的言语,说实话,小菜真的远非更加深层次的刺探对象的定义,只可以稳步积攒了,其实只要大家不从编制程序的角度去对待编制程序,就会发觉其实编制程序只是和平日的消除方案壹样,就像买高铁票,去订票厅能够买,在网上能够买,这编制程序达成的就是网上买票的那么些进程,和其他措施实现的法力都是均等把票买到,只是经过不是均等。在那本书里面,小编详细说了下形式(Pattern)的简史,最开首,方式是在建筑行业建议并利用的,到了后来,由Gof四人帮把情势设计引进到编制程序世界,并收编了贰二个最常用的设计情势,得以渐渐发展壮大。

  方式定义如下:模式是某上下文环境中二个题材的消除方案。

  但是笔者更爱好作者的概念:格局是某上下文环境中二个题材的“常用”消除方案。

  常用并不错的形式才方可算上确实的情势,用钥匙开门和用锤子撬门都可以进入房屋,但是用榔头撬门进去房屋并不成为一种方式。

  GoF为情势定义了伍个基本要素:

  •  情势名称(Pattern
    name)
  •  问题(Problem)
  •  消除方案(Solution)
  •  效果(Consequence)

目的和格局

  即使平昔是用的面向对象的言语,说实话,小菜真的远非更加深层次的问询对象的定义,只可以稳步积攒了,其实只要大家不从编制程序的角度去对待编制程序,就会发现实际编制程序只是和常见的缓解方案1样,就好像买火车票,去订票厅可以买,在网上能够买,那编程达成的就是网上售票的这一个进度,和任何方式完毕的成效都以同一把票买到,只是经过不是壹样。在那本书里面,小编详细说了下形式(Pattern)的简史,最早先,格局是在建筑行业建议并动用的,到了新生,由Gof四个人帮把格局设计引进到编制程序世界,并收编了二三个最常用的设计情势,得以慢慢发展壮大。

  形式定义如下:情势是某上下文环境中二个题指标解决方案。

  而是自身更欣赏小编的概念:情势是某上下文环境中一个难点的“常用”消除方案。

  常用并正确的方式才方可算上真正的方式,用钥匙开门和用锤子撬门都足以进去房屋,不过用榔头撬门进去房屋并不成为1种情势。

  GoF为情势定义了五个基本要素:

  •  情势名称(Pattern
    name)
  •  问题(Problem)
  •  化解方案(Solution)
  •  效果(Consequence)

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

  立时快要度岁了,大家都很愿意,回家的措施有那一个种,汽车,高铁,船,飞机等,不管怎么着措施回家,回家过新禧就八个进程:买票、回家和家里庆祝。

  比如坐高铁回家就能够那一个写:

882828九五至尊手机版 1882828九五至尊手机版 2

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

View Code

  不过有个旁人索要坐火车,有的人索要坐汽车回家,那我们复制+粘贴修改下:

882828九五至尊手机版 3882828九五至尊手机版 4

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

View Code

  那样大家就会意识难题,增添一种交通工具,大家就要复制+粘贴下,这样代码就会变得难以维护和开发,针对这种气象,小编建议了一种口径:D大切诺基Y(Don’T
Repeat
Yourself,不要复复制你本身)
,至于那种条件的好与坏作者就不解说了,下边大家这种达成格局的标题莫过于正是代码重用,下边说下模板方法情势的使用。

模板方法方式-从回家过大年谈起

  立刻快要过大年了,我们都很愿意,回家的形式有广大种,汽车,火车,船,飞机等,不管怎么样措施回家,归家过年就几个进程:领票、回家和家里庆祝。

  比如坐火车回家就可以那么些写:

882828九五至尊手机版 5882828九五至尊手机版 6

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

View Code

  但是有些人索要坐高铁,有的人索要坐汽车回家,那我们复制+粘贴修改下:

882828九五至尊手机版 7882828九五至尊手机版 8

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

View Code

  那样大家就会意识难题,扩张1种交通工具,大家就要复制+粘贴下,这样代码就会变得难以维护和开销,针对那种情形,笔者提议了壹种口径:DBMWX叁Y(Don’T
Repeat
Yourself,不要复复制你自个儿)
,至于那种条件的好与坏我就不解说了,下面大家那种完成方式的标题莫过于就是代码重用,上面说下模板方法情势的施用。

动用持续

  幸免代码重用,OOP的一大特征正是继续,既然都以购票、回家和在家庆祝,那我们得以把那二种方法抽象出来,代码如下:

882828九五至尊手机版 9882828九五至尊手机版 10

 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那个抽象方法,而不要求去贯彻别的的方法。坐火车我们就足以如此达成:

882828九五至尊手机版 11882828九五至尊手机版 12

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

View Code

  相类似的,坐飞机:

882828九五至尊手机版 13882828九五至尊手机版 14

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

View Code

  在上头的例子中HapplyPeople2那几个类就是模板,其实在开发一些其余东西的时候我们偶尔也会用到Template,比如做壹些CMS(内容管理体系)的时候,因为就那一个页面,只是页面包车型客车体制会有所不相同,不相同的系统幸好,如若一个系统用分歧的页面样式就相比难办了,那时候就能够用到Template,如下:

  882828九五至尊手机版 15

  里面是有个别经过自定义的模版语言创设的模版页面,生成的时候会转接为对应的代码,那样我们就能够二个系统全体区别的样式,只须求在后台切换下,非常便宜。

  实则慢慢就会发觉格局会使用到此外省方,只要你精心观望,它就在您身边。

运用持续

  防止代码重用,OOP的一大特点正是后续,既然都以定票、回家和在家庆祝,那大家能够把那二种艺术抽象出来,代码如下:

882828九五至尊手机版 16882828九五至尊手机版 17

 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这几个抽象方法,而不要求去落到实处任何的点子。坐轻轨大家就足以那样完成:

882828九五至尊手机版 18882828九五至尊手机版 19

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

View Code

  相就好像的,坐飞机:

882828九五至尊手机版 20882828九五至尊手机版 21

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

View Code

  在上边的事例中HapplyPeople二这么些类就是模板,其实在付出壹些其余东西的时候大家有时也会用到Template,比如做一些CMS(内容管理种类)的时候,因为就那几个页面,只是页面包车型地铁样式会迥然分化,分歧的种类还好,假诺1个连串用分化的页面样式就比较难办了,那时候就能够用到Template,如下:

  882828九五至尊手机版 22

  里面是部分通过自定义的沙盘语言创立的沙盘页面,生成的时候会转化为相应的代码,那样大家就足以2个连串有着不一致的样式,只须求在后台切换下,分外便利。

  其实逐步就会意识方式会采取到其它地点,只要您仔细观察,它就在你身边。

引进回调

  言归正传,我们选择模板方法发现有许多益处,比如代码重用、易于扩大、消除代码冗余难点等,然则当子类变得越多的时候,就会变得那么不简单保险了。比如我们查询数据库的音讯:

  1.  连接Connection对象
  2.  执行查询语句
  3.  处理查询的结果并分析重返结果

  通过上边的须要大家就足以窥见1和二都是壹致的,只是重回结果处理的格局区别,回调区别语言有两样的落到实处况势,C语言使用函数指针完成,java使用个中匿名类实现,C#运用委托(delegate)完成,因为作者整本书都以用java写的,作者电脑没装java环境,那就用大家熟稔的C#实现了。

  代码如下:

882828九五至尊手机版 23882828九五至尊手机版 24

 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

882828九五至尊手机版 25882828九五至尊手机版 26

 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

引进回调

  言归正传,大家选择模板方法发现有不可胜数利益,比如代码重用、易于扩大、消除代码冗余难题等,可是当子类变得越来越多的时候,就会变得那么不便于保险了。比如我们查询数据库的音信:

  1.  连接Connection对象
  2.  执行查询语句
  3.  处理查询的结果并分析再次回到结果

  通过上面的须要大家就足以窥见一和2都以同样的,只是重返结果处理的不二诀窍不一致,回调区别语言有差别的落到实处际情时局,C语言使用函数指针实现,java使用个中匿名类达成,C#运用委托(delegate)完毕,因为小编整本书都以用java写的,作者电脑没装java环境,那就用咱们熟习的C#实现了。

  代码如下:

882828九五至尊手机版 27882828九五至尊手机版 28

 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

882828九五至尊手机版 29882828九五至尊手机版 30

 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

882828九五至尊手机版,后记

  骚年们,和菜肴一起整文学习啊,未完待续。。。

 

后记

  骚年们,和菜肴1起整军事学习啊,未完待续。。。

 

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图