在使用抽象类时,可以将部分逻辑以具体方法和具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方法实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式。
- 现有三类事物机器人、美女、帅哥,这三类事务可以完成的功能如下。
- 机器人:吃饭、工作。
- 美女:吃饭、跑步、睡觉。
- 帅哥:吃饭、工作、跑步、睡觉。
- 那么现在问题就是如何将以上的程序变成操作类。
- 那么首先应该思考的是这三类事物的共同特征:四个固定的操作行为。
package test;
/*
* 在使用抽象类时,可以将部分逻辑以具体方法和具体构造函数的形式实现,
* 然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的
* 方法实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式。
*/
public class TemplateMeyhod {
public static void main(String[] args) {
Action actA=new Robot();//机器人行为
actA.command(Action.EAT);
actA.command(Action.WORK);
Action actB=new Woman();
actB.command(Action.EAT+Action.SLEEP+Action.RUN);
Action actC=new Man();
actC.command(Action.EAT+Action.SLEEP+Action.RUN+Action.WORK);
}
}
/**
* 现有三类事物机器人、美女、帅哥,这三类事务可以完成的功能如下。
* 机器人:吃饭、工作。
* 美女:吃饭、跑步、睡觉。
* 帅哥:吃饭、工作、跑步、睡觉。
* 那么现在问题就是如何将以上的程序变成操作类。
* 那么首先应该思考的是这三类事物的共同特征:四个固定的操作行为。
* @author lily
*
*/
abstract class Action{
public static final int EAT=1;
public static final int WORK=2;
public static final int SLEEP=5;
public static final int RUN=10;
public abstract void eat(); //声明抽象方法
public abstract void work();
public abstract void sleep();
public abstract void run();
public void command(int ch){ //具体命令
switch (ch) {
case EAT:
this.eat();
break;
case WORK:
this.work();
break;
case SLEEP:
this.sleep();
break;
case RUN:
this.run();
break;
case EAT+WORK:
this.eat();
this.work();
break;
case EAT+SLEEP+RUN:
this.eat();
this.work();
this.run();
break;
case EAT+SLEEP+RUN+WORK:
this.eat();
this.work();
this.run();
this.work();
break;
}
}
}
class Robot extends Action{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("为机器人加燃料。");
}
@Override
public void work() {
System.out.println("让机器人开始工作。");
}
@Override
public void sleep() {
}
@Override
public void run() {
}
}
class Woman extends Action{
@Override
public void eat() {
System.out.println("请美女吃饭。");
}
@Override
public void work() {
}
@Override
public void sleep() {
System.out.println("让美女睡美容觉。");
}
@Override
public void run() {
System.out.println("让美女跑步健身。");
}
}
class Man extends Action{
@Override
public void eat() {
System.out.println("帅哥吃饭。");
}
@Override
public void work() {
System.out.println("帅哥为了和美女幸福地生活在一起,要好好工作。");
}
@Override
public void sleep() {
System.out.println("帅哥休息好以恢复精神和体力。");
}
@Override
public void run() {
System.out.println("帅哥通过跑步来锻炼身体。");
}
}