#1.目的
- オブジェクト指向の備忘録
- UML設計の備忘録
#2.概要
ドラゴンボールの世界は悟空・人造人間セル・魔人ブウなどの様々な戦士によって構成されている
今回は一般人と異なる彼らに焦点を置きながらスモールケースの設計・実装を行う
※具体的な実装に関しては都度行っていく
#3.UML設計
####UML図(クラス図)
よく使うものまとめ
#4.設計 ~ 実装
戦士の特徴:戦う機能 → インターフェースとして扱う
Fighter.java
interface Fighter {
void fight();
}
戦士達は上記の機能を所持し,以下の特徴を持つ
- 名前
- 戦闘力
- 体力
- 技を習得する
- 技を繰り出す...など
DragonballWarrior.java
public class DragonballWarrior implements Fighter {
private String name;
private int property;
private int HP;
@Override
public void fight() {
}
public void getSkill() {
}
public void doSkill() {
}
}
悟空は戦士のサブクラスとして扱える
戦士の共通項を纏めさらに細分化する
- サイヤ人(一定条件下でスーパーサイヤ人化 / 月を見ると猿人)
- 人造人間(製造番号 / 号機名)
- 地球人武道家
- ナメック星人(損傷を自己修復 / 同化)
Saiyan.java
public class Saiyan extends DragonballWarrior {
/** [1:normal / 2:monkey / 3:super-saiyan] */
private int status;
public void changeStatus(Saiyan saiyan) {
this.status = saiyan.status;
}
}
戦士達を戦わせる天下一武道会を設計したい
- フィールド
- 戦士
- 天候
天下一武道会 - 戦士のhas-a関係について考える
スーパークラスのコンストラクタやゲッター/セッターについて定義する
DragonballWarrior.java
public class DragonballWarrior implements Fighter {
private String name;
private int property;
private int HP;
/** default constractor */
DragonballWarrior() {
}
DragonballWarrior(String name, int property, int HP) {
this.name = name;
this.property = property;
this.HP = HP;
}
@Override
public void fight() {
}
public void getSkill() {
}
public void doSkill() {
}
// S - getter,setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getProperty() {
return property;
}
public void setProperty(int property) {
this.property = property;
}
public int getHP() {
return HP;
}
public void setHP(int hP) {
HP = hP;
}
// E - getter,setter
}
Saiyan.java
public class Saiyan extends DragonballWarrior {
/** [1:normal / 2:monkey / 3:super-saiyan] */
private int status = 0;
public Saiyan(String name, int property, int HP) {
super(name, property, HP);
}
public void changeStatus(Saiyan saiyan) {
this.status = saiyan.status;
}
@Override
public void doSkill() {
if (super.getName().equals("Goku")) {
System.out.println("kamehame-ha");
}
}
@Override
public void fight() {
if (super.getName().equals("Goku")) {
System.out.println("ora-Goku!");
}
}
Saiyan.java
public class MartialArtist extends DragonballWarrior {
public MartialArtist(String name, int property, int HP) {
super(name, property, HP);
}
@Override
public void doSkill() {
if (super.getName().equals("Kuririn")) {
System.out.println("kien-zan");
}
}
@Override
public void fight() {
if (super.getName().equals("Kuririn")) {
System.out.println("oreha-Kuririn!");
}
}
}
BattleTournament.java
public class BattleTournament {
private List<DragonballWarrior> dwlist;
public static void main(String args[]) {
List<DragonballWarrior> dwlist = new ArrayList<>();
dwlist.add(new Saiyan("Goku", 50000, 200));
dwlist.add(new Saiyan("Vegeta", 40000, 250));
dwlist.add(new MartialArtist("Kuririn", 3000, 80));
dwlist.add(new MartialArtist("Kamesennin", 3000, 80));
for (DragonballWarrior dw : dwlist) {
dw.fight();
dw.doSkill();
}
}
}
#5.実行結果
実行結果.java
ora-Goku!
kamehame-ha
oreha-Kuririn!
kien-zan
突っ込みどころ満載ですが
ポリモーフィズムが働いていることを確認できました
→続きはまたいつか
#6.終わり
3ヶ月テスター → 基本設計に回りデザインパターン学ばなければと思い立ちました
完全体セルはシングルトン・クラス設計,技はインターフェースor抽象クラスに纏めてcompositionの関係
今度は匿名クラス→ジェネリクス→ラムダ式と関数型インターフェース→Stream APIについて纏めてみたいです