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

java 设计模式 学习笔记(9) 模板方法模式

2011-04-23 16:31 891 查看
模板方法模式:

定义一个操作中算法的骨架,将这个骨架中包含的其他方法延迟到子类去实现。模板方法模式使得子类可以在不改变一个算法的结构前提下重新定义该算法中的某些步骤的实现。

模板方法模式的用处 :

当不变的和可变的行为在子类的方法实现中混合成一起的时候,不变的行为就会在多个子类中重复出现。通过模板方法模式可以将这些不变的行为搬移到父类中去。

简单的理解就是:父类定义了一套行为流程,并且实现了这套行为流程中的某些公共的行为,而行为流程中那些不是公共的行为就交给子类去实现。

一般来说,先定义一个抽象类。该抽象类有一个方法,而该方法中又包含了一系列的操作步骤。不同的子类对这一系列的操作会根据自己的实际情况去实现。

1. 首先定义一个模板抽象类, 该模板定义了一个骨架方法,描述的是一个人从起床到去上班的过程。应该说大多数上班族都是符合这样的特征。不过具体到每个人,其每个步骤都有很多种实现方式,例如洗漱吃早饭的具体内容都是不一样的。

/**
* 这是一个模板类,有一个骨架方法morning ,骨架方法中定义了一系列的操作
* 有些操作是需要子类根据自身情况去是实现。
* @author liaogang
*/
public abstract class Template {
public abstract void eatBreakfast();
public abstract void washFace();
public abstract void dressUP();
public void morning(){
System.out.println("get up!");
washFace();
dressUP();
eatBreakfast();
System.out.println("go to work!");
}
}


2. 定义一个模板类得子类,这个子类描述的某个人A 在早上的具体行为。A遵循模板类规定的一系列操作,但在具体实现上有自己的特点,需要实现3个抽象方法。

public class DailyLifeA extends Template{
@Override
public void eatBreakfast() {
System.out.println("have a bottle of milk ");
}
@Override
public void washFace() {
System.out.println("take a bath");
}
@Override
public void dressUP() {
System.out.println("take formal clothes");
}
}


3. 同样再定义一个模板子类,它也继承了模板类的骨架方法,不过需要实现3个抽象方法。

public class DailyLifeB extends Template{
@Override
public void eatBreakfast() {
System.out.println("i eat a bread and an egg!");
}
@Override
public void washFace() {
System.out.println("washFace");
}
@Override
public void dressUP() {
System.out.println("dress a new coat");
}
}


从上面的代码可以看到,两个模板类的子类都实现了吃饭,洗脸,穿衣三个方法,但具体实现有自己的特点。需要注意的一点是,子类并没有也不应该去重写骨架方法,如果重写了骨架方法,那么父类定义的骨架被子类修改就达不到规范子类行为的目的。而模板方法模式最大的特点就是要求所有子类都必须按照父类给定的一个模板或者骨架去做事情。

4. 编写测试代码来验证模板方法模式实现的正确性

public class TestTemplatePattern {

public static void main(String[] ags){

Template template;

template = new DailyLifeA();    //
template.morning();

template = new DailyLifeB();
template.morning();
}
}


输出结果:

get up!

take a bath

take formal clothes

have a bottle of milk

go to work!

get up!

washFace

dress a new coat

i eat a bread and an egg!

go to work!

从输出结果看到,每个子类都遵循着 起床-> 洗漱-> 穿衣-> 吃饭 -> 去上班 的生活方式。 但是有的人喜欢早上洗澡,有的人只需要洗脸。有些人早饭吃包子,有些人早上吃油条。

通过实验结果,可以看到,模板方法模式将不需要变动的代码定义在父类,而免去了所有子类做重复代码的可能性。例如在本例子中的起床,去上班的行为都是在父类中实现的,子类就不需要重复这些代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: