有时候有些事情可以分为几个步骤,但是具体每步做什么事可能不一样,这种情况下就是适合使用模板模式.
模板模式就是定义做一件事情需要做哪几步抽象出来,具体的实现交给继承类,然后抽象类里面定义一个执行方法按顺序调用之前定义的那些步骤.
举个具体情况,大家往冰箱放东西可以分为这几步:
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