C#设计模式之十三模板方法模式(Template Method Pattern)【行
一、引言 2.4、模式的组成 ?? ? ??? 模板方法模式参与者: (1)、抽象类角色(AbstractClass):定义一个模板方法(TemplateMethod),在该方法中包含着一个算法的骨架,具体的算法步骤是PrimitiveOperation1方法和PrimitiveOperation2方法,该抽象类的子类将重定义PrimitiveOperation1和PrimitiveOperation2操作。 (2)、具体类角色(ConcreteClass):实现PrimitiveOperation1方法和PrimitiveOperation2方法以完成算法中与特定子类(Client)相关的内容。 在模板方法模式中,AbstractClass中的TemplateMethod提供了一个标准模板,该模板包含PrimitiveOperation1和PrimitiveOperation2两个方法,这两个方法的内容Client可以根据自己的需要重写。 2.5、模板方法模式的具体实现 ??? 理解了模板方法的定义之后,自然实现模板方法也不是什么难事了,下面以生活中吃饺子为例来实现模板方法模式。在现实生活中,做饺子的步骤都大致相同,如果我们针对每种饺子的做法都定义一个类,这样在每个类中都有很多相同的代码,为了解决这个问题,我们一般的思路肯定是把相同的部分抽象出来到抽象类中去定义,具体子类来实现具体的不同部分,这个思路也正式模板方法的实现精髓所在,具体实现代码如下: 1 namespace 模板方法模式的实现 2 { 3 /// <summary> 4 /// 好吃不如饺子,舒服不如倒着,我最喜欢吃我爸爸包的饺子,今天就拿吃饺子这件事来看看模板方法的实现吧 5 </summary> 6 class Client 7 { 8 static void Main(string[] args) 9 { 10 //现在想吃绿色面的,猪肉大葱馅的饺子 11 AbstractClass fan = new ConcreteClass(); 12 fan.EatDumplings(); 13 14 Console.WriteLine(); 15 过了段时间,我开始想吃橙色面的,韭菜鸡蛋馅的饺子 16 fan = ConcreteClass2(); 17 18 19 20 Console.Read(); 21 } 22 } 23 24 25 该类型就是抽象类角色--AbstractClass,定义做饺子的算法骨架,这里有三步骤,当然也可以有多个步骤,根据实际需要而定 26 public abstract AbstractClass 27 28 该方法就是模板方法,方法里面包含了做饺子的算法步骤,模板方法可以返回结果,也可以是void类型,视具体情况而定 29 void EatDumplings() 30 31 和面 32 MakingDough(); 33 包馅 34 MakeDumplings(); 35 煮饺子 36 BoiledDumplings(); 37 38 Console.WriteLine("饺子真好吃!"); 39 40 41 要想吃饺子第一步肯定是“和面”---该方法相当于算法中的某一步 42 MakingDough(); 43 44 要想吃饺子第二部是“包饺子”---该方法相当于算法中的某一步 45 MakeDumplings(); 46 47 要想吃饺子第三部是“煮饺子”---该方法相当于算法中的某一步 48 BoiledDumplings(); 49 50 51 该类型是具体类角色--ConcreteClass,我想吃绿色面皮,猪肉大葱馅的饺子 52 sealed ConcreteClass : AbstractClass 53 54 55 override MakingDough() 56 57 我想要面是绿色的,绿色健康嘛,就可以在此步定制了 58 Console.WriteLine(在和面的时候加入芹菜汁,和好的面就是绿色的 59 60 61 62 MakeDumplings() 63 64 我想吃猪肉大葱馅的,在此步就可以定制了 65 Console.WriteLine(农家猪肉和农家大葱,制作成馅 66 67 68 69 BoiledDumplings() 70 71 我想吃大铁锅煮的饺子,有家的味道,在此步就可以定制了 72 Console.WriteLine(用我家的大铁锅和大木材煮饺子 73 74 75 76 该类型是具体类角色--ConcreteClass2,我想吃橙色面皮,韭菜鸡蛋馅的饺子 77 ConcreteClass2 : AbstractClass 78 79 80 81 82 我想要面是橙色的,加入胡萝卜汁就可以。在此步定制就可以了。 83 Console.WriteLine(在和面的时候加入胡萝卜汁,和好的面就是橙色的 84 85 86 87 88 89 我想吃韭菜鸡蛋馅的,在此步就可以定制了 90 Console.WriteLine(农家鸡蛋和农家韭菜,制作成馅 91 92 93 94 95 96 此处没要求 97 Console.WriteLine(可以用一般煤气和不粘锅煮就可以 98 99 100 } ?? 这个模式很简单,备注也很详细,看备注应该差不多了,还有一点就是,模板方法里面的算法步骤,可以有默认实现,也可以没有实现,在C#里面可以是抽象方法,当然模板方法也可以有有返回值,也可以没有返回值。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |