首页 > 代码库 > 模板设计方法——面条很香
模板设计方法——面条很香
最近很喜欢吃面,今天一下课就又去吃面了。上次吃的排骨面,上上次吃的鸡排面,两个都好吃。其实吧,想想
这两唯一的区别就是加鸡排的就是鸡排面,加排骨就是排骨面。别的东西都一样。
吃饱回来,继续学习大话设计模式之模板方法模式。
所谓的模板方法模式,就是定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改
变一个算法结构就可重新定义算法的某些特定步骤。
看看模板方法的结构图:
理论总是需要实践去证明的,接下来就让我们以文章开头的大碗面为例,举例细说模板方法模式。
食堂的大碗面分有鸡排,排骨面等等,面的叫法不一样,但是做法一样,加的原料也差不多,葱,香菜,汤。唯
一的不同就是加排骨还是鸡排。
来看看代码的实现:
abstract class Noodles //抽象面类 { public abstract void meat(); public abstract void soup();//抽象行为放到子类中去实现 public abstract void onion(); public abstract void coriander(); } class ChickenNoodles : Noodles//鸡排面 { public override void meat() { Console .WriteLine ( "加鸡排"); } public override void soup() { Console .WriteLine("有汤"); } public override void onion() { Console .WriteLine( "有葱"); } public override void coriander() { Console .WriteLine("有香菜"); } } class SpareribsNoodles : Noodles//排骨面 { public override void meat() { Console .WriteLine("加排骨"); } public override void soup() { Console.WriteLine("有汤"); } public override void onion() { Console.WriteLine("有葱"); } public override void coriander() { Console.WriteLine("有香菜"); } }
上述代码,可以看出,两种面代码好多是重复的,所以应该修改代码,如下:
abstract class Noodles //抽象面类 { public abstract void meat();//抽象方法放到子类中去实现 public void soup() { Console.WriteLine("有汤"); } public void onion() { Console.WriteLine("有葱"); } public voidcoriander() { Console.WriteLine("有香菜"); } } class ChickenNoodles :Noodles//鸡排面 { public override voidmeat() { Console .WriteLine ("加鸡排"); } } class SpareribsNoodles :Noodles//排骨面 { public override voidmeat() { Console.WriteLine("加排骨"); } }
对比发现,修改之后的子类代码非常简单。相同操作的方法都在父类中去实现,子类中之存放不相同的方法。这里应该注意所有重复的代码都应该上升到父类中,而不是让每个子类都重复。
先看看整体结构图:
最后总结一下模板方法的特点:通过把不变的行为搬移到父类,去除子类中重复的代码来体现它的优势。
例子中的鸡排面和排骨面只因为加的肉不同而不同,所以子类中只有这个方法,别的方法都相同,所以都写到父类中。
将学习和生活结合起来,学习将更高效和搞笑O(∩_∩)O~
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。