定义
定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类不改变一个算法的结构即可重定义算法的某些特定步骤。
使用场景
多个子类有共有的方法,并且逻辑基本相同时。
面对重要,复杂的算法,可以把核心算法设计为模版方法,周边相关细节功能则由子类实现。
需求通过子类来决定父类算法中的某个步骤是否执行,实现子类对父类的反向控制。
优点
模版模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
子类实现算法的某些细节,有助于算法的扩展。
模版方法就是提供了一个很好的代码复用平台。
缺点
每个不同的实现都需要定义一个子类,这会导致类的个数增加,设计更加抽象。
特点
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模版方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
结构图
描述
灭绝师太与张三丰对打,分别开启不同的内功,经脉,武功,武器,步伐。
完整示例
创建抽象类,定义完整框架
Class PHA.YX.Design.TemplateMethod.AbstractSwordsMan Extends %RegisteredObject [ Abstract ]
{
Method Fighting() [ Final ]
{
d ..NeiGong()
d ..JingMai()
i ..HasWeapons() d
.d ..Weapons()
d ..Moves()
d ..Hook()
}
Method Hook()
{
}
Method NeiGong() [ Abstract ]
{
}
Method Weapons() [ Abstract ]
{
}
Method Moves() [ Abstract ]
{
}
Method JingMai()
{
w "开启七经八脉",!
}
Method HasWeapons() As %Boolean
{
q $$$YES
}
}
具体实现类
Class PHA.YX.Design.TemplateMethod.ZhangSanFeng Extends AbstractSwordsMan
{
Method HasWeapons() As %Boolean
{
q $$$NO
}
Method Moves()
{
w "凌波微步",!
}
Method NeiGong()
{
w "运行九阳神功",!
}
Method Weapons()
{
}
}
Class PHA.YX.Design.TemplateMethod.MieJueShiTai Extends AbstractSwordsMan
{
Method HasWeapons() As %Boolean
{
q $$$YES
}
Method Hook()
{
w "倚天剑被夺走,逃跑",!
}
Method Moves()
{
w "使用隐身",!
}
Method NeiGong()
{
w "九阴真经",!
}
Method Weapons()
{
w "使用倚天剑",!
}
}
调用
/// dclass(PHA.YX.Design.Program).TemplateMethod()
ClassMethod TemplateMethod()
{
#dim zsf as PHA.YX.Design.TemplateMethod.AbstractSwordsMan
s zsf =class(PHA.YX.Design.TemplateMethod.ZhangSanFeng).%New()
d zsf.Fighting()
w !
#dim mhst as PHA.YX.Design.TemplateMethod.AbstractSwordsMan
s mhst =class(PHA.YX.Design.TemplateMethod.MieJueShiTai).%New()
d mhst.Fighting()
}
DHC-APP>dclass(PHA.YX.Design.Program).TemplateMethod()
运行九阳神功
开启七经八脉
凌波微步
九阴真经
开启七经八脉
使用倚天剑
使用隐身
倚天剑被夺走,逃跑
思考
两个同学做试卷,抽取重复的代码,提炼代码,用模版方法如何实现,并给出调用
Class PHA.YX.Design.TemplateMethod.TestPaperA Extends %RegisteredObject
{
Method TestQuestion1()
{
w "杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[]a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维"
w "答案:b"
}
Method TestQuestion2()
{
w "杨过,程英,陆无双铲除了情花,造成[]a.使这植物不再害人 b. 使一种珍惜物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化"
w "答案:a"
}
Method TestQuestion3()
{
w "杨过在绝情谷中了[]毒a.阿司匹林 b.牛黄解毒片 c.情花毒 d.以上全不对"
w "答案:c"
}
}
Class PHA.YX.Design.TemplateMethod.TestPaperB Extends %RegisteredObject
{
Method TestQuestion1()
{
w "杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[]a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维"
w "答案:d"
}
Method TestQuestion2()
{
w "杨过,程英,陆无双铲除了情花,造成[]a.使这植物不再害人 b. 使一种珍惜物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化"
w "答案:c"
}
Method TestQuestion3()
{
w "杨过在绝情谷中了[]毒a.阿司匹林 b.牛黄解毒片 c.情花毒 d.以上全不对"
w "答案:a"
}
}
感兴趣的同学实现后可以发我一起参考下。