定义:
定义一个操作中算法的框架,并且将一部分操作延迟到子类当中。使得子类可以不改变一个算法的结构即可重新定义算法步骤。
结构图:
- AbstractClass:抽象方法类,定义了一些基本操作,这些操作可以是抽象方法,也可以是具体方法,每一个基本操作对应一个算法步骤,子类可以重新实现这些操作。同事也定义了一个模板方法,用于定义算法框架。
- ConcreteClass:具体方法类,实现了抽象类中定义地而未实现的抽象方法,借此来改变父类中算法步骤。
抽象方法类中的基本方法:
在抽象类中,定义的基本方法一般有下面三种:
- 抽象方法: 抽象类未实现,具体由子类实现该方法。
- 具体方法:抽象类提供了实现,子类可以选择继承或者覆盖。
- 钩子方法:
- isXXX():与具体操作进行挂钩,控制算法步骤中的不同步骤。
- 实现为空的具体方法:子类如果没有覆盖父类中的方法,编译可以正常通过,而不像抽象方法一样,在C++语言中可以采用vitrual字段来控制。
优点:
- 在父类中形式化定义一个算法,由它的子类来实现细节处理,但并不改变算法执行次序。
- 将共同的代码放入抽象类中,实现代码的复用。
- 可以实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一方法是否被执行。
- 更换子类的方法和增加子类很方便,符合单一职责和开闭原则。
实例: