##TemplateMethodパターン
Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せること。そのため、システムのフレームワークを構築するための手段としてよく活用される。
参考書籍
EFFECTIVE JAVA 第2版 (The Java Series)
help somebody understand
package TemplateMethod;
/**
* Created by shu on 2017/01/09.
*/
interface Soldier {
String name();
int powerLevel();
String attackName();
String race();
void print();
}
abstract class Saiyan implements Soldier {
String mName;
int mPowerLevel;
String mAttackName;
String mRace;
Saiyan() {
mName = name();
mPowerLevel = powerLevel();
mAttackName = attackName();
mRace = race();
}
abstract public String name(); // 名前
abstract public int powerLevel();// 戦闘力
abstract public String attackName(); // 技名
public String race() {
return "サイヤ人";
}
public void print() {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("##################\n");
strBuilder.append(mName + "\n");
strBuilder.append("戦闘力:" + mPowerLevel + "\n");
strBuilder.append("技:" + mAttackName + "\n");
strBuilder.append("出身:" + mRace + "\n");
strBuilder.append("##################\n");
System.out.println(strBuilder.toString());
}
}
abstract class Earth implements Soldier {
String mName;
int mPowerLevel;
String mAttackName;
String mRace;
Earth() {
mName = name();
mPowerLevel = powerLevel();
mAttackName = attackName();
mRace = race();
}
abstract public String name();
abstract public int powerLevel();// 戦闘力
abstract public String attackName(); // 技名
public String race() {
return "地球人";
}
public void print() {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("##################\n");
strBuilder.append(mName + "\n");
strBuilder.append("戦闘力:" + mPowerLevel + "\n");
strBuilder.append("技:" + mAttackName + "\n");
strBuilder.append("出身:" + mRace + "\n");
strBuilder.append("##################\n");
System.out.println(strBuilder.toString());
}
}
class SonGoku extends Saiyan {
@Override
public String name() {
return "孫悟空";
}
@Override
public int powerLevel() {
return 10000;
}
@Override
public String attackName() {
return "かめはめ波";
}
}
class Krillin extends Earth {
@Override
public String name() {
return "クリリン";
}
@Override
public int powerLevel() {
return 1000;
}
@Override
public String attackName() {
return "気円斬";
}
}
class SoldierProfile {
public static void main(String[] arg){
SonGoku sonGoku = new SonGoku();
sonGoku.print();
Krillin krillin = new Krillin();
krillin.print();
}
}