您的位置:首页 > 编程语言 > Java开发

Java设计模式(十四)之行为型模式:模板方法模式

2018-11-02 22:26 375 查看

一、定义:

所谓模板方法模式就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法模式是基于继承的代码复用技术的。在模板方法模式中,我们可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中。也就是说我们需要声明一个抽象的父类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法让子类来实现剩余的逻辑,不同的子类可以以不同的方式来实现这些逻辑。

其实所谓模板就是一个方法,这个方法将算法的实现定义成了一组步骤,其中任何步骤都是可以抽象的,交由子类来负责实现。这样就可以保证算法的结构保持不变,同时由子类提供部分实现。

模板是一个方法,那么他与普通的方法存在什么不同呢?模板方法是定义在抽象类中,把基本操作方法组合在一起形成一个总算法或者一组步骤的方法。而普通的方法是实现各个步骤的方法,我们可以认为普通方法是模板方法的一个组成部分。

UML结构图:

模式中的角色:

抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。

具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

 

二、模式实现:

举个例子,以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。

抽象类AbstractClass:

[code]//抽象类定义整个流程骨架
public abstract class AbstractPerson{
//模板方法,使用final修改,防止子类改变算法的实现步骤
public final void prepareGotoSchool(){
dressUp();
eatBreakfast();
takeThings();
}
//以下是不同子类根据自身特性完成的具体步骤
protected abstract void dressUp();
protected abstract void eatBreakfast();
protected abstract void takeThings();
}

具体类ConcreteClass:

[code]public class Student extends AbstractPerson{
@Override
protected void dressUp() {
System.out.println(“穿校服");
}
@Override
protected void eatBreakfast() {
System.out.println(“吃妈妈做好的早饭");
}

@Override
protected void takeThings() {
System.out.println(“背书包,带上家庭作业和红领巾");
}
}
[code]public class Teacher extends AbstractPerson{
@Override
protected void dressUp() {
System.out.println(“穿工作服");
}
@Override
protected void eatBreakfast() {
System.out.println(“做早饭,照顾孩子吃早饭");
}

@Override
protected void takeThings() {
System.out.println(“带上昨晚准备的考卷");
}
}
[code]public class Client {
public static void main(String[] args) {
Student student = new Student()
student.prepareGotoSchool();

Teacher teacher  = new Teacher()
teacher.prepareGotoSchool();
}
}

 

三、模板方法模式小结:

1、优点:

(1)模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

(2)模板方法模式在定义了一组算法,将具体的实现交由子类负责。

(3)模板方法模式是一种代码复用的基本技术。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

2、缺点:

每个不同的实现都需要定义一个子类,导致类的个数的增加,使得系统更加庞大,设计更加抽象。

3、适用场景:

(1)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

(2)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

(3)控制子类扩展,子类必须遵守算法规则。
 

参考博客链接:

https://www.geek-share.com/detail/2586195081.html

https://www.geek-share.com/detail/2640058220.html

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐