现在假设有三类现实的事物(或者是更多的事物):
Ø 机器人(Robot):具备充电、工作两个基本操作;
Ø 人类(Human):具备吃饭、工作、睡觉三个基本操作;
Ø 猪(Pig):具备吃饭、睡觉两个基本操作。
定义的一个行为类
abstract class Action { // 定义一个抽象的行为类,行为不是具体的
// 定义常量时必须保证两个内容相加的结果不是其它行为,例如:EAT + SLEEP的结果为6不会和其它值冲突
public static final int EAT = 1; // 定义吃的命令
public static final int SLEEP = 5; // 定义睡的命令
public static final int WORK = 7; // 定义工作的命令
public void command(int flag) {
switch (flag) { // switch只支持数值判断,而if支持条件判断
case EAT: // 当前为吃的操作
this.eat();// 调用子类中具体的“吃”方法
break;
case SLEEP: // 当前为睡的操作
this.sleep(); // 调用子类中具体的“睡”方法
break;
case WORK: // 当前为工作的操作
this.work();// 调用子类中具体的“工作”方法
break;
case EAT + WORK: // 行为组合,本处只是举例说明,不演示
this.eat(); // 调用“吃”的方法
this.work();// 调用“工作”的方法
break;
}
}
public abstract void eat(); // 定义子类的操作标准
public abstract void sleep(); // 定义子类的操作标准
public abstract void work(); // 定义子类的操作标准
}
定义描述机器人的行为子类
class Robot extends Action { // 定义机器人行为
public void eat() { // 覆写行为的操作
System.out.println("机器人补充能量!");
}
public void sleep() { // 此操作不需要但必覆写,所以方法体为空
}
public void work() { // 覆写行为的操作
System.out.println("机器人正在努力工作!");
}
}
定义人的类
class Human extends Action { // 定义人类行为
public void eat() { // 覆写行为的操作
System.out.println("人类正在吃饭!");
}
public void sleep() { // 覆写行为的操作
System.out.println("人类正在睡觉休息!");
}
public void work() { // 覆写行为的操作
System.out.println("人为了梦想在努力工作!");
}
}
定义猪的类
class Pig extends Action {
public void eat() { // 覆写行为的操作
System.out.println("猪正在啃食槽!");
}
public void sleep() { // 覆写行为的操作
System.out.println("猪在睡觉养膘!");
}
public void work() { // 此操作不需要但必覆写,所以方法体为空
}
}
测试行为
public class TestDemo {
public static void main(String args[]) {
fun(new Robot()); // 传递机器人行为子类
fun(new Human()); // 传递人类行为子类
fun(new Pig()); // 传递猪的行为子类
}
/**
* 执行具体的操作行为,假设本处只执行EAT、SLEEP、WORK三个行为
* act 具体的行为对象
*/
public static void fun(Action act) {
act.command(Action.EAT); // 调用“吃”操作
act.command(Action.SLEEP); // 调用“睡”操作
act.command(Action.WORK); // 调用“工作”操作
}
}
程序执行结果:
机器人补充能量!(机器人行为)
机器人正在努力工作!(机器人行为)
人类正在吃饭!(人类行为)
人类正在睡觉休息!(人类行为)
人为了梦想在努力工作!(人类行为)
猪正在啃食槽!(猪行为)
猪在睡觉养膘!(猪行为)