演習問題4(陳列棚)


演習問題4-1 (Mediator)

同じ商品が5台の陳列棚(Shelf クラス)に並べられています。お客さん(Customer クラス)は陳列棚から商品を購入します。

そして、売り場主任(Manager クラス)は、どの陳列棚でも商品がなくなったら、一番商品がたくさんある陳列棚から商品の半分を補充します。

陳列棚(Shelf クラス)や売り場主任(Manager クラス)を作成しなさい。

ただし、Shelf クラスはどのクラスからでも利用できるようにし、このクラスでは結果を表示しないようにしなさい(表示は売り場主任である Manager クラスで行います)。


実行結果
陳列棚Bに陳列棚Eから25個商品を補充しました。
陳列棚Cに陳列棚Eから11個商品を補充しました。
陳列棚Cに陳列棚Bから8個商品を補充しました。
陳列棚Eに陳列棚Cから4個商品を補充しました。
陳列棚Bに陳列棚Aから3個商品を補充しました。
陳列棚Aに陳列棚Cから2個商品を補充しました。
陳列棚Dに陳列棚Eから2個商品を補充しました。
陳列棚Dに陳列棚Bから1個商品を補充しました。
陳列棚Bに陳列棚Aから1個商品を補充しました。
陳列棚Aに陳列棚Cから1個商品を補充しました。
陳列棚Dは売り切れました。
陳列棚Cは売り切れました。
陳列棚Eは売り切れました。
陳列棚Aは売り切れました。
すべて売り切れました。


コード

Enshu401.java
public class Enshu401 { private Shelf[] shelfList = { new Shelf("陳列棚A", 30), new Shelf("陳列棚B", 10), new Shelf("陳列棚C", 20), new Shelf("陳列棚D", 20), new Shelf("陳列棚E", 50) }; // 陳列棚(名前、商品数)5台 public static void main(String[] args) { Enshu401 en = new Enshu401(); en.exec(); } public void exec() { Manager manager = new Manager(shelfList); // 売り場主任 for (int i = 0 ; i < shelfList.length ; i++) shelfList[i].setNotification(manager); // 通知先を売り場主任にする Customer customer = new Customer(shelfList); customer.start(); // Customer クラスの開始 try { customer.join(); // Customer クラスの終了を待つ } catch(InterruptedException e) {} } }
Customer.java
public class Customer extends Thread { // お客さん private Shelf[] shelfList; // 陳列棚 private Random random = new Random(); // 乱数生成機 public Customer(Shelf[] shelfList) { this.shelfList = shelfList; } public void run() { // start メソッドを呼ぶことで実行される do { try { Thread.sleep(1000); // 1秒ごと } catch(InterruptedException e) {} } while(buy()); // すべて売り切れで終了 } private boolean buy() { // 購入 int shelfNo = random.nextInt(shelfList.length); // 陳列棚番号 int amount = random.nextInt(10) + 1; // 購入数(1~10) int stock = shelfList[shelfNo].getStock(); // 陳列棚上の商品数 int orgNo = shelfNo; while (stock == 0) { // 売り切れ if (++shelfNo >= shelfList.length) shelfNo = 0; if (shelfNo == orgNo) return false; // すべて売り切れ stock = shelfList[shelfNo].getStock(); } shelfList[shelfNo].bought(Math.min(stock, amount)); // 商品が充分になければ、あるだけ return true; } }








演習問題4-1 (Mediator)