模 板 方 法 模 式
想必各位常常会遇到这样的问题,在编写继承关系时,有些方法的逻辑所有子类都是一样的,我只希望子类在某些逻辑上不同,最后达到想要的效果……
其实要让我们照着这个目的去写的话,甚至不用刻意学习,我们写出来的也就和模板方法模式(行为型)大差不差。
介绍
其实就像我隔壁那篇对比接口与抽象基类时那个敌人类一样,我们会根据需要将父类中希望子类实现的和希望使用默认实现的给区分开。
正如同这里我希望子类可以选择重写NoMoreShotsNeed来判断是否被攻击,因为我们有的敌人可能拥有不被选中的天选体制!而扣除血量的方法我选择只能通过默认方法实现,因为这个关系核心机制的方法不可以随便改动。当然也可以使用abstract关键字来指定必须由子类实现的方法,实现特性统一。
模板方法的思路就是这样,划分出固定的和可变的行为,再让子类自由发挥。但模板方法中,有一个核心概念——“算法骨架”。它通过组合父类中定义的可变或不可变的方法形成算法,而这个算法则是子类重写的真正目标。
总的来说,其优点也是其目标就是,封装不变部分,扩展可变部分,减少代码重复,从而便于维护。
实现
实现模板方法模式可能会需要以下角色。
1、抽象父类:包含一个“算法骨架”,该骨架定义一组有序的方法调用关系,其实就是包含我们需要的步骤的算法,条件语句循环语句都可以存在。
2、具体子类:继承抽象父类,实现抽象方法。一般来说父类中一定会有一个必须子类实现的抽象方法,这是子类间不同特性的关键。
3、钩子方法:可选。其实就是拥有默认实现的可重写方法,提高灵活性。
好的,光说不练假把式。这里就以在大世界中自在生活的史莱姆为例,用C++实现这个模式!背景是世界中有许许多多的史莱姆,有冰史莱姆,早晨起来就去湖面上玩,火史莱姆,起来后就去岩浆上面玩,风史莱姆,起来就去云朵上玩。这里他们的活动地点各不相同。
正常史莱姆都是跳着前去,就风史莱姆特殊,它必须飞着去。然后他们晚饭都吃的是天地灵气和日月精华,然后吃完就去睡觉。
好了现在该实现《史莱姆的一天》了!
以下为全部代码的实现。
这段代码中,分离了可变步骤和不可变步骤,同时包含了钩子方法,成功实现了模板方法模式。现在看一下输出吧!
小结
这就是模板方法模式了,平常用到的应该很多。
如有补充纠正欢迎留言,我们下次再见~
参考列表:
菜鸟教程-设计模式:www.runoob.com