定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类不改变一个算法的结构即可重定义算法的某些特定步骤。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模版方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
灭绝师太与张三丰对打,分别开启不同的内功,经脉,武功,武器,步伐。
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 "使用倚天剑",!
}
}
/// d ##class(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>d ##class(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"
}
}
感兴趣的同学实现后可以发我一起参考下。