标签:
有时候有些事情可以分为几个步骤,但是具体每步做什么事可能不一样,这种情况下就是适合使用模板模式.
模板模式就是定义做一件事情需要做哪几步抽象出来,具体的实现交给继承类,然后抽象类里面定义一个执行方法按顺序调用之前定义的那些步骤.
举个具体情况,大家往冰箱放东西可以分为这几步:
1.买冰箱(如果有可以不用买)
2.打开冰箱门
3.放入东西
4.关闭冰箱门.
我们可以定义一个抽象模板,在模板定义这些步骤抽象方法,然后定义一个执行方法来以一定顺序调用之前定义的步骤.一般这个执行方法为了不让子类去修改会加上final修饰符.
具体实现:
模板抽象类
/* 模板抽象类 */
public abstract class AbstractTemplate {
public abstract void buyFridge();
public abstract void openFridgeDoor();
public abstract void put();
public abstract void closeFridgeDoor();
public abstract boolean hasFridge();
public final void putSomeThingIntoFridge() {
if (!hasFridge()) {
buyFridge();
}
openFridgeDoor();
put();
closeFridgeDoor();
}
}
小红
/* 具体实现类XiaoHong */
public class XiaoHongClass extends AbstractTemplate {
@Override
public void buyFridge() {
}
@Override
public void openFridgeDoor() {
System.out.println("打开冰箱冷冻室门");
}
@Override
public void put() {
System.out.println("把冷饮放入");
}
@Override
public void closeFridgeDoor() {
System.out.println("关闭冰箱冷冻室门");
}
@Override
public boolean hasFridge() {
return true;
}
}
小明
/*具体实现类小明*/
public class XiaoMingClass extends AbstractTemplate {
@Override
public void buyFridge() {
System.out.println("买一个冰箱");
}
@Override
public void openFridgeDoor() {
System.out.println("打开冰箱冷藏室门");
}
@Override
public void put() {
System.out.println("把剩菜放入");
}
@Override
public void closeFridgeDoor() {
System.out.println("关闭冰箱冷藏室门");
}
@Override
public boolean hasFridge() {
return false;
}
}
执行小明和小红把东西放到冰箱的执行方法.
public class Test {
public static void main(String[] args){
XiaoHongClass xiaoHong = new XiaoHongClass();
XiaoMingClass xiaoMing = new XiaoMingClass();
System.out.println("小红把东西放到冰箱--------");
xiaoHong.putSomeThingIntoFridge();
System.out.println("\n小明把东西放到冰箱--------");
xiaoMing.putSomeThingIntoFridge();
}
}
执行结果:
小红把东西放到冰箱-------- 打开冰箱冷冻室门 把冷饮放入 关闭冰箱冷冻室门 小明把东西放到冰箱-------- 买一个冰箱 打开冰箱冷藏室门 把剩菜放入 关闭冰箱冷藏室门
小明没有冰箱所以比小红多了一个买冰箱的动作.小红是把 冷饮放到冷冻室.而小明是把剩菜放入冷藏室.
感觉很简单是不是,我也觉得,但是这个模板模式很常用的.
标签:
原文地址:http://my.oschina.net/u/2250599/blog/414536