たかしー！ご飯ができたわよー！　Ovserverパターンを使用したご飯の通知

###【概要】
デザインパターンの`Observer`パターンを使用したプログラミングです。
「たかし」と「のぼる」に朝食、昼食、夕食ができたことを通知します。
Java8を使用しています。

###【階層図】
DesignPattern　→　プロジェクト名
　　　|---src
　　　　　|---Observer　→　パッケージ名
　　　　　　　　　　|---Observer.java（観察者を表現するインターフェース）
　　　　　　　　　　|---ChildObserver.java（ご飯ができたことを通知するクラス）
　　　　　　　　　　|---CookGenerator.java（ご飯を作る抽象クラス）
　　　　　　　　　　|---BreakfastGenerator.java（朝食を作るクラス）
　　　　　　　　　　|---LunchGenerator.java（昼食を作るクラス）
　　　　　　　　　　|---DinnerGenerator.java（夕食を作るクラス）
　　　　　　　　　　|---Main.java（プログラム実行用のメイン処理を行うクラス）

###【クラス図】
![observer.png](https://qiita-image-store.s3.amazonaws.com/0/121997/422f6b88-1804-1064-7464-9401294a9753.png)


###【コード】

```Java:Observer.java
package Observer;

public interface Observer {
	public abstract void update(CookGenerator generator);
}
```

```Java:ChildObserver.java
package Observer;

public class ChildObserver implements Observer {
	private String name;

	public ChildObserver(String name) {
		this.name = name;
	}

	public void update(CookGenerator generator) {
		System.out.println(name + "！　" + generator + "ができたわよー！");
	}
}
```

```Java:CookGenerator.java
package Observer;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public abstract class CookGenerator {
	private List<Observer> observers = new ArrayList<>();

	public void addObserver(Observer observer) {
		observers.add(observer);
	}

	// このメソッドは使用していません
	public void deleteObserver(Observer observer) {
		observers.remove(observer);
	}

	public void notifyObservers() {
		Iterator it = observers.iterator();
		while (it.hasNext()) {
			Observer o = (Observer)it.next();
			o.update(this);
		}
	}

	public abstract void cook();

}
```

```Java:BreakfastGenerator.java
package Observer;

public class BreakfastGenerator extends CookGenerator {
	@Override
	public void cook() {
		notifyObservers();
	}

	@Override
	public String toString() {
		return "朝ごはん";
	}
}
```

```Java:LunchGenerator.java
package Observer;

public class LunchGenerator extends CookGenerator {
	@Override
	public void cook() {
		notifyObservers();
	}

	@Override
	public String toString() {
		return "昼ごはん";
	}
}
```

```Java:DinnerGenerator.java
package Observer;

public class DinnerGenerator extends CookGenerator {
	@Override
	public void cook() {
		notifyObservers();
	}

	@Override
	public String toString() {
		return "夕ごはん";
	}
}
```


```Java:Main.java
package Observer;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class Main {

	public static void main(String[] args) throws Exception {
		List<CookGenerator> generatorList = new ArrayList<>();

		CookGenerator breakfast = new BreakfastGenerator();
		CookGenerator lunch = new LunchGenerator();
		CookGenerator dinner = new DinnerGenerator();
		generatorList.add(breakfast);
		generatorList.add(lunch);
		generatorList.add(dinner);

		Observer takashi = new ChildObserver("たかし");
		Observer noboru = new ChildObserver("のぼる");

		for (CookGenerator generator : generatorList) {
			generator.addObserver(takashi);
			generator.addObserver(noboru);
		}

		for (CookGenerator generator : generatorList) {
			generator.cook();
			TimeUnit.SECONDS.sleep(2);
		}
	}
}
```

###【実行結果】
```実行結果
たかし！　朝ごはんができたわよー！
のぼる！　朝ごはんができたわよー！
たかし！　昼ごはんができたわよー！
のぼる！　昼ごはんができたわよー！
たかし！　夕ごはんができたわよー！
のぼる！　夕ごはんができたわよー！
```

###【参考】
[増補改訂版Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?ie=UTF8&qid=1515328473&sr=8-1&keywords=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

###【おまけのコーナー】
・GitHubで見つけたデザインパターン集
　　[java-design-patterns](https://github.com/iluwatar/java-design-patterns)