定 义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
优 点:
1、封装不可变部分、扩展可变部分
2、提取公共部分代码,便于维护
3、行为由父类控制,子类实现
缺 点:按照正常的设计,抽象类负责申明最抽象,最一般的事务属性和方法,实现类完成具体的事务属性和方法。但是模板方法却跌倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响
使用场景:
1、多个子类有公有的方法,并且逻辑基本相同时
2、重要、复杂的算法,可以把核心算法设计为模板犯法,周边的相关细节功能则由各个子类实现
3、重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束行为
应用案例:
例如制造一个车模型,车子可以启动、停止、喇叭、启动等操作,而这些操作都是可以在子类中随意配置的,设计出来的类图如下:
那么当子类实现抽象类的时候,可以随意让先按喇叭,然后再启动,也可以让车子启动后再按喇叭,其中有一个重要的功能那就是喇叭操作是否可以不要呢?如果两个车子创建的流程是一模一样,但是有的车子并不需要喇叭,这个时候,可以将相同的代码抽取到父类中,然后通过钩子函数,来约束父类的行为,设计好的UMl图如下:
模板方法可以说是提供了灵活的方式,让子类变得更加轻松和更加自由,轻松之处在于很多复杂核心的操作可以放在父类中实现,而自由之处是自己可以随便组装来完成自己的任务,如谷歌的工作环境非常之好,员工可以带宠物来公司,可以上班时间按摩,可以锻炼身体,可以游泳,可以自由工作,另外还有20%的自由时间可以用来做工作分配以外的事情。多么美好的公司,是所有人所向往的,我们用UML图来实现这一美好梦想:
估计看完了上面的UML图以后,就明白了模板方式有多么大的吸引力,完全一种自由的方式来完成自己在谷歌一天的生活,真是完美。其实生活中的方式都和这个模板差不多,吃饭,刷牙,洗脸,有些人喜欢先洗脸再刷牙然后再吃饭,还有些人喜欢先吃饭再刷牙,然后再洗脸,正是由于这个模板方法模式,让世界变的更多样性,让世界变的更加的美好。
Public MustInherit Class HumanModel标签:End,Sub,利剑,子类,Overrides,Console,设计模式,Public,模板 From: https://blog.51cto.com/u_15870687/5837381
Public MustOverride Sub start()
Public MustOverride Sub stop1()
Public MustOverride Sub alarm()
Public MustOverride Sub engineBoom()
Public Sub run()
'定义运行的顺序
start()
engineBoom()
alarm()
stop1()
End Sub
End Class ' HumanModel
Public Class HummerH1
Inherits HumanModel
Public Overrides Sub start()
Console.WriteLine("悍马H1启动")
End Sub
Public Overrides Sub stop1()
Console.WriteLine("悍马H1停止")
End Sub
Public Overrides Sub alarm()
Console.WriteLine("悍马H1鸣喇叭")
End Sub
Public Overrides Sub engineBoom()
Console.WriteLine("悍马H1引擎声音")
End Sub
End Class ' HummerH1
Public Class HummerH2
Inherits HumanModel
Public Overrides Sub start()
Console.WriteLine("悍马H2启动")
End Sub
Public Overrides Sub stop1()
Console.WriteLine("悍马H2停止")
End Sub
Public Overrides Sub alarm()
Console.WriteLine("悍马H2鸣喇叭")
End Sub
Public Overrides Sub engineBoom()
Console.WriteLine("悍马H2引擎声音")
End Sub
End Class ' HummerH2
Sub Main()
Dim h1 As HummerH1 = New HummerH1
h1.run()
Dim h2 As HummerH2 = New HummerH2
h2.run()
Console.ReadLine()
End Sub