概念
定义一个操作的算法流程,共性部分封装到父类,个性部分抽象,由子类自定义实现。使得子类在不改变算法结构的前提下重新定义某些步骤的实现。
- 抽象类(AbstractClass):定义了算法的骨架。
- 具体类(ConcreteClass):实现抽象类中的抽象方法,完成整体流程。
例子:
餐厅点餐,需要经历排队,点餐以及吃饭的过程,排队和吃饭共性部分封装到AbsOrder类,但是每个人点餐的食物是不一样的,可以将此步骤抽象。
public abstract class AbsOrder {
/**
* 排队
*/
protected void waitQueue(){
System.out.println("排队...");
}
/**
* 点餐
*/
protected abstract void order();
/**
* 吃饭
*/
protected void eat(){
System.out.println("吃饭...");
}
}
A用户点了小鸡炖蘑菇
public class AOrder extends AbsOrder{
@Override
protected void order() {
System.out.println("点了小鸡炖蘑菇");
}
}
B用户点了小龙虾
public class BOrder extends AbsOrder{
@Override
protected void order() {
System.out.println("点了小龙虾");
}
}
调用类:
public class Client {
public static void main(String[] args) {
AbsOrder absOrder = new AOrder();
absOrder.waitQueue();
absOrder.order();
absOrder.eat();
}
}
优点:
把不变的行为封装到父类,减少了子类中的重复代码,符合开闭原则
缺点:
不同的实现都要定义一个子类,导致类的数量增加