抽象类的实际应用-模板设计模式
1、 抽象类的最大特点在于强制规定了子类的实现结构,那么除了这一特点之外,抽象类更多的情况下还可以起到一个模板的作用,下面做一个简单的分析:
1、人=吃饭+睡觉+工作;
2、猪=吃饭+睡觉;
3、机器人=吃饭+工作。
那么现在假设有一个按钮控制(方法),一旦传入了某些指令之后就可以进行相应的处理。
2、我们定义一个抽象的行为类:
//描述一个抽象的行为
abstract class Action {
public static final int EAT_FLAG= 1;
public static final int SLEEP_FLAG= 5;
public static final int WORK_FLAG= 10;
public void command(int cmd) {
switch (cmd) {
case EAT_FLAG:
this.eat();
break;
case SLEEP_FLAG:
this.sleep();
break;
case WORK_FLAG:
this.work();
break;
case EAT_FLAG + SLEEP_FLAG + WORK_FLAG:
this.eat();
this.sleep();
this.work();
default:
break;
}
}
//不确定具体的实现,但是行为应该定义好
public abstract void eat();
public abstract void sleep();
public abstract void work();
}
3、定义人的行为的子类。
//人
class Human extends Action {
@Override
public void eat() {
System.out.println("人吃饭要吃熟食,干净的食物!");
}
@Override
public void sleep() {
System.out.println("人困了就要睡觉。");
}
@Override
public void work() {
System.out.println("人要努力拼搏。");
}
}
4、定义猪的行为的子类。
//猪
class Pig extends Action {
@Override
public void eat() {
System.out.println("猪用槽子吃,吃糠");
}
@Override
public void sleep() {
System.out.println("猪在圈里睡觉。");
}
@Override
public void work() {
}
}
5、定义机器人的行为子类:
//机器人
class Robbbot extends Action {
@Override
public void eat() {
System.out.println("机器人补充能量。");
}
@Override
public void sleep() {
}
@Override
public void work() {
System.out.println("机器人不停工作");
}
}
6、调用各自的行为操作。
public class TemplateDesign {
public static void main(String[] args) {
fun(new Human());
fun(new Pig());
fun(new Robbbot());
}
public static void fun(Action action) {
action.command(Action.EAT_FLAG+Action.SLEEP_FLAG + Action.WORK_FLAG);
}
}
7、实际上通过此程序的定义结构你可以清楚发现一个问题:
1、抽象类在实际的使用过程之中会定义一些固话的模式,它只能接收几种特定的指令。
2、但是每种指令的具体实现由子类负责完成,父类只做了方法的约定。
这个最具有代表性的就是Servlet程序。
8、抽象类虽然后定义了子类必须要做的事情,但是抽象类依然存在有单继承的局限
抽象类的使用必须要通过子类进行对象实例化处理。