TemplateMethodパターン

##TemplateMethodパターン
Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せること。そのため、システムのフレームワークを構築するための手段としてよく活用される。

参考書籍
EFFECTIVE JAVA 第2版 (The Java Series)

増補改訂版 Java言語で学ぶデザインパターン入門

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();
    }
}

ABOUTこの記事をかいた人

hundredappsの管理人であり、ソフトウェア開発者です。 開発したソフトウェアで、世の中の不便を1つでも改善できたらと思います。