ある処理フローの大まかな流れ (Template Method) をAbstractClassに記述しておき、実際の具体的な処理はConcreteClassに記述します。システムのフレームワークを実装する場合等に用いられます。
sample.java
abstract class AbstractClass {
public abstract void task1();
public abstract void task2();
public final void taskFlow() { //final修飾子 (継承先でオーバーライド不可)
task1();
task2();
}
}
class ConcreteClass1 extends AbstractClass {
private int val;
public ConcreteClass1(int val) {this.val=val;}
public void task1() {System.out.println(val+val);}
public void task2() {System.out.println(val*val);}
}
class ConcreteClass2 extends AbstractClass {
private int val;
public ConcreteClass2(int val) {this.val=val;}
public void task1() {System.out.println(val-val);}
public void task2() {System.out.println(val/val);}
}
class Sample {
public static void main(String args[]) {
AbstractClass obj1 = new ConcreteClass1(1);
AbstractClass obj2 = new ConcreteClass2(1);
obj1.taskFlow();
obj2.taskFlow();
}
}
$ javac sample.java && java Sample
2
1
0
1