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