演習問題5(ワゴン)


演習問題5-1 (State)
タイムサービス
 番号おまけメッセージ
通常1無しいつもどおり
サービス210個で1個サービス中
大サービス35個で1個大サービス中

1個100円の商品がワゴン(Wagon クラス)に山積みになっています。

タイムサービス中は、購入した個数によって1個おまけされます。

サービス中は10個で1個、大サービス中は5個で1個、おまけとして余分に買えるわけです。


ワゴンである Wagon クラスを作成し、また、それに合わせて Enshu501 クラスも正しく動作するように作成しなさい。

ただし、「通常」「サービス」「大サービス」のどれが選ばれているかによって、同じように、500円や1000円で商品を買ってもおまけが異なります。実行結果は、「通常」「サービス」「大サービス」の順にタイムサービスの番号を入力しています。(ここでは、1回の入力で、500円と1000円で買っています。)

また、Wagon クラスは、タイムサービスの内容や種類の数に変更があっても(10個で1個ではなく20個で1個に変えたり、3個で1個という出血大サービスを増やしても)改修しなくてもよいようにしなさい。

Wagon クラス
  • コンストラクタで、商品の価格を設定する。
  • setState() メソッドで、サービスの種類を設定する。
    各サービスは State クラスのサブクラスとして作成する。
  • buy() メソッドで、引数の数だけ商品を購入する。
    ただし、戻り値がおまけを含めた実際に購入できた個数である。
  • getMessage() メソッドで、メッセージを得る。

実行結果
1. いつもどおり
2. サービス
3. 大サービス
番号>1
いつもどおりなので、500円で5個買えた。
いつもどおりなので、1000円で10個買えた。
番号>2
サービス中なので、500円で5個買えた。
サービス中なので、1000円で11個買えた。
番号>3
大サービス中なので、500円で6個買えた。
大サービス中なので、1000円で12個買えた。
番号>


コード

Enshu501.java
public class Enshu501 { private Wagon wagon = new Wagon(100); // ワゴン(100円) public static void main(String[] args) { Enshu501 en = new Enshu501(); en.exec(); } public void exec() { BufferedReader r = new BufferedReader(new InputStreamReader(System.in), 1); System.out.println("1. いつもどおり"); System.out.println("2. サービス"); System.out.println("3. 大サービス"); String no; int n; while (true) { System.out.print("番号>"); try { no = r.readLine(); n = Integer.parseInt(no); } catch(Exception e) { return; } if (n == 1) // 通常 wagon.setState(new StateOrdinary()); else if (n == 2) // サービス wagon.setState(new StateSpecial()); else if (n == 3) // 大サービス wagon.setState(new StateLimitedSpecial()); else return; buy(500); // 500円 buy(1000); // 1000円 } } private void buy(int payment) { // payment:支払金額 int bought = wagon.buy(payment); // bought :購入できた個数 System.out.println(wagon.getMessage() + "なので、" + payment + "円で" + bought + "個買えた。"); } }
State.java
public abstract class State { public abstract int buy(Wagon wagon, int payment); public abstract String getMessage(); }






演習問題5-1 (State)