您的位置:首页 > 其它

模板方法模式(Template Method)

2017-12-18 15:07 555 查看
定义:

定义一个模板结构,将具体内容延迟到子类去实现。

解决的问题:

提高代码复用性。将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中

实现了反向控制。通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”

uml类图:



模式组成:

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

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

优点:

提高代码复用性

将相同部分的代码放在抽象的父类中

提高了拓展性

将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为

实现了反向控制

通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”

缺点:

引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度

举个栗子:

定义抽象角色

abstract class AbstractPerson {
public void prepareGotoSchool() {
dressup();
eatBreakfast();
takeThings();
}

void dressup() {
System.out.println("穿衣洗漱");
}

protected abstract void eatBreakfast();

protected abstract void takeThings();
}


定义具体实现

class Student extends AbstractPerson {
@Override
protected void eatBreakfast() {
System.out.println("吃妈妈做好的早餐");
}

@Override
protected void takeThings() {
System.out.println("背书包,带好作业去学校");
}
}


定义具体实现

class Teacher extends AbstractPerson {
@Override
protected void eatBreakfast() {
System.out.println("做早饭,并照顾孩子吃早饭");
}

@Override
protected void takeThings() {
System.out.println("带上昨晚准备的试卷");
}
}


客户端调用

public static void main(String[] args) {
Student s = new Student();
Teacher t = new Teacher();
s.prepareGotoSchool();
System.out.println("=============");
t.prepareGotoSchool();
}


输出

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