目次
目的
Observerパターンの使いどころとなる状況を具体例でもって理解する。
ゴール(実現すること)
商品の予約システムにおけるユーザ通知
実装する機能
・商品を予約するユーザを登録する(オブザーバーの追加)
・予約はキャンセルできる(オブザーバーの削除)
・入荷されたら登録しているユーザに通知する(オブザーバへの通知)
クラス図
※抽象化のメリットが無いので、具象クラスのみとする。
予約するユーザの登録:Item.reserve(User)
予約のキャンセル :Item.cancel(User)
入荷によるユーザ通知:Item.arrival() -> User.notification()
ソースコード
Item class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package observer.reservation; import java.util.ArrayList; import java.util.List; public class Item { private List<user> _reserveUsers; private String _itemName; public Item(String itemName) { _reserveUsers = new ArrayList<>(); _itemName = itemName; } public String itemName() { return _itemName; } public void reserve(User user) { _reserveUsers.add(user); } public void cancel(User user) { _reserveUsers.remove(user); } public void arrival() { System.out.println(itemName() + "が入荷しました。"); for (User user : _reserveUsers) { user.notification(); } } } </user> |
User class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package observer.reservation; public class User { private String _name; public User(String name) { _name = name; } public String name() { return _name; } public void notification() { System.out.println(name() + "さんに通知します。"); } } |
Main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package observer.reservation; public class Main { public static void main(String...strings) { User taro = new User("太郎"); User jiro = new User("次郎"); Item titan32 = new Item("進撃の巨人 32巻"); titan32.reserve(taro); titan32.reserve(jiro); titan32.cancel(taro); titan32.arrival(); } } |
実行結果
1 2 |
進撃の巨人 32巻が入荷しました。 次郎さんに通知します。 |
参考
リンク
コメント