演習問題5(ワゴン)


演習問題5-3 (Chain of Responsibility)
タイムサービス
 時刻おまけメッセージ
割引き13時3割引き3割引
サービス10時と16時10個で1個サービス中
大サービス15時5個で1個大サービス中
通常それ以外無しいつもどおり

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

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

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

また、13時には新たに3割引きサービスが追加されています。


このように、タイムサービスが増減(タイムサービスの時刻やサービス内容の変更はなく、大サービスをやめたり、3割引きサービスを増やしたり)されても、Enshu503 クラス以外の既存のクラスをその都度改修しなくてもよいように改修しなさい。


実行結果
9時、いつもどおりなので、1000円で10個買えた。
10時、サービス中なので、1000円で11個買えた。
11時、いつもどおりなので、1000円で10個買えた。
13時、3割引なので、1000円で14個買えた。
15時、大サービス中なので、1000円で12個買えた。
16時、サービス中なので、1000円で11個買えた。
17時、いつもどおりなので、1000円で10個買えた。


コード

Enshu503.java
public class Enshu503 { private Wagon wagon = new Wagon(100); // ワゴン(100円) public static void main(String[] args) { State l = SingleLimitedSpecial.getInstance(); State s = SingleSpecial.getInstance(); State d = SingleDiscount.getInstance(); State o = SingleOrdinary.getInstance(); l.setNextState(s).setNextState(d).setNextState(o); // 次のクラスを設定する Enshu503 en = new Enshu503(); en.exec(); } public void exec() { sales(9); //  9時、いつもどおり sales(10); // 10時、サービス sales(11); // 11時、いつもどおり sales(13); // 13時、3割引 sales(15); // 15時、大サービス sales(16); // 16時、サービス sales(17); // 17時、いつもどおり } private void sales(int hour) { buy(hour, 1000); // 1000円 } private void buy(int hour, int payment) { // payment:支払金額 wagon.setState(SingleLimitedSpecial.getInstance()); // 最初のクラスを設定する int bought = wagon.buy(hour, payment); // bought :購入できた個数 System.out.println(hour + "時、" + wagon.getMessage() + "なので、" + payment + "円で" + bought + "個買えた。"); } }






演習問題5-3 (Chain of Responsibility)