事務屋さんの備忘録

主にプログラミングのことを書いていきます。メモというか備忘録的な感じで。プログラミングといっても、私はプロのエンジニアでも本職のプログラマーでもありません。単なる事務職をやってるサラリーマンで、空いた時間にちょこちょこっとプログラミングしてる程度です。よってこのブログに記載したことが誤っていたり、もっとよい方法がある場合もあると思います。その場合には、ご指摘いただけると嬉しいです。また、このブログを読んで役に立った、なんて方がいらっしゃったら幸いですね。

デザインパターン Commandパターン

メモ。

package com.command1;

// 実験セット
public class Beaker {
	
	private double water = 0; // 水
	private double salt = 0;  // 食塩
	private boolean melted = true;  // 食塩が全て溶けた時true  溶け残った時false
	
	// コンストラクタ
	public Beaker(double water, double salt){
		this.water = water;
		this.salt = salt;
		this.mix(); // かき混ぜる
	}
	
	// ビーカーに食塩を加えるメソッド
	public void addSalt(double salt){
		this.salt += salt;
	}
	
	// ビーカーに水を加えるメソッド
	public void addWater(double water){
		this.water += water;
	}
	
	// かき混ぜるメソッド
	public void mix(){
		// 溶けたか、溶け残ったかをセットする 常温での飽和食塩水の濃度は26.4%
		if ((this.salt / (this.salt + this.water)) * 100 < 26.4 ) {
			melted = true;
		} else {
			melted = false;
		}	
	}
	
	// 食塩の量を返すメソッド
	public double getSalt(){
		return salt;
	}
	
	// 水の量を返すメソッド
	public double getWater(){
		return water;
	}
	
	// 溶けたか、溶け残ったかを調べるメソッド
	public boolean isMelted(){
		return melted;
	}
	
	// 実験結果をノートに記録する
	public void note(){
		System.out.println("水:" + water + "g");
		System.out.println("食塩:" + salt + "g");
		System.out.println("濃度:" + (salt / (salt + water)) * 100 + "%");
	}

}
package com.command1;

// 実験コマンドのスーパークラス
public abstract class Command {
	
	// ビーカー
	protected Beaker beaker;
	
	// ビーカーをセットするメソッド
	public void setBeaker(Beaker beaker){
		this.beaker = beaker;
	}
	
	// 要求内容を実行するメソッド	
	public abstract void execute();
}
package com.command1;

// 食塩を1gずつ加える実験のコマンドクラス
public class AddSaltCommand extends Command {

	@Override
	public void execute() {
		// TODO 自動生成されたメソッド・スタブ
		// 食塩を1gずつ加えて飽和食塩水を作る実験をする場合
		// 完全に溶けている間は食塩水を加える
		while (beaker.isMelted()) {
			beaker.addSalt(1);
			beaker.mix();
		}
		
		// 実験結果をノートへ記述する
		System.out.println("食塩を1gずつ加える実験");
		beaker.note();
	}

}
package com.command1;

// 水を10gずつ加える実験のコマンドクラス
public class AddWaterCommand extends Command {

	@Override
	public void execute() {
		// TODO 自動生成されたメソッド・スタブ
		// 水を10gずつ加えて飽和食塩水を作る実験をする場合
		while (!beaker.isMelted()) {
			beaker.addWater(10);
			beaker.mix();
		}
		
		// 実験結果をノートへ記述する
		System.out.println("水を10gずつ加える実験");
		beaker.note();
	}

}
package com.command1;

// 食塩水を作る実験のコマンドクラス
public class MakeSaltWaterCommand extends Command {

	@Override
	public void execute() {
		// TODO 自動生成されたメソッド・スタブ
		// 食塩水を作る実験
		beaker.mix();
		
		// 濃度を量り、ノートへ記述する
		System.out.println("食塩水を作る実験");
		beaker.note();
	}

}
package com.command1;

public class Student {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		// 実験内容(コマンドオブジェクト)を用意します
		Command addSalt = new AddSaltCommand();
		Command addWater = new AddWaterCommand();
		Command makeSaltWater = new MakeSaltWaterCommand();
		
		// 実験セットを実験内容にセットします
		addSalt.setBeaker(new Beaker(100, 0)); // 水100gの入ったビーカーをセットします
		addWater.setBeaker(new Beaker(0, 10)); // 食塩10gの入ったビーカーをセットします
		makeSaltWater.setBeaker(new Beaker(90, 10)); // 水90g、食塩10gの入ったビーカーをセットします
		
		// 実験を行う
		addSalt.execute();
		addWater.execute();
		makeSaltWater.execute();
 	}

}


結果

食塩を1gずつ加える実験
水:100.0g
食塩:36.0g
濃度:26.47058823529412%
水を10gずつ加える実験
水:30.0g
食塩:10.0g
濃度:25.0%
食塩水を作る実験
水:90.0g
食塩:10.0g
濃度:10.0%