【設計模式】——策略模式之賭球風波

前提摘要:

今天晚上世界盃進行淘汰賽,一場重頭戲是巴西隊和智利隊。小華是內馬爾的粉絲,他希望巴西隊能贏,小玉認爲智利隊是黑馬,能贏巴西隊。於是二人打賭,賭資爲每個球10元,比如兩隊進5球,則輸的一方需出50元;小華又加了一條,如果內馬爾進球則賭資加10元;小玉又加了一條,如果兩隊90分鐘之內打平,需點球決勝負,則說明兩隊實力相近,賭資減少20%


策略模式:

圍繞賭資的多少,抽象出一個父類,然後三個具體算法類繼承父類,再用一個策略選擇類爲算法類和界面類承上啓下,界面部分根據相應要求給出代碼!結構圖爲:



編寫代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 策略模式
{
    public partial class 賭球那點事 : Form
    {
        public 賭球那點事()
        {
            InitializeComponent();
        }

        //賭資抽象類
        abstract class CashSuper
        {
            public abstract double acceptCash(double money);
        }

        //正常情況下賭資子類
        class CashNormal : CashSuper
        {
            public override double acceptCash(double money)
            {
                double result = money;
                return money;
            }
        }

        //內馬爾進球后的賭資
        class CashAdd : CashSuper
        {
            private double goalsNeymar = 0.0d;
            private double moneyAdd = 0.0d;
            public CashAdd(string goalsNeymar, string moneyAdd)
            {
                this.goalsNeymar = double.Parse(goalsNeymar);
                this.moneyAdd = double.Parse(moneyAdd);
            }
            public override double acceptCash(double money)
            {
                double result = money;
                if (goalsNeymar > 0)
                    result = money + goalsNeymar * moneyAdd;
                return result;
            }
        }

        //90分鐘未分勝負,需點球時賭資
        class CashRebate : CashSuper
        {
            private double moneyRebate = 1d;
            public CashRebate(string moneyRebate)
            {
                this.moneyRebate = double.Parse(moneyRebate);
            }
            public override double acceptCash(double money)
            {
                return money * moneyRebate;
            }
        }

        //CashContext類
        class CashContext
        {
            private CashSuper cs;
            public CashContext(CashSuper csuper)
            {
                this.cs = csuper;
            }
            public double GetResult(double money)
            {
                return cs.acceptCash(money);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            double total = 0.0d;
            CashContext cc = null;
            switch (cmbType.SelectedItem .ToString())
            {
                case "正常計算":
                    cc = new CashContext(new CashNormal());
                    break;
                case "內馬爾進球":
                    cc = new CashContext(new CashAdd("1", "10"));
                    break;
                case "點球大戰":
                    cc = new CashContext(new CashRebate("0.8"));
                    break;
            }
            double totalPrices = 0d;
            totalPrices = cc.GetResult (Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
            total = total + totalPrices;
            txtShow.Text = "單價:" + txtPrice.Text + "進球數:" + txtNum.Text
                + " " + cmbType.SelectedItem + " 合計:" + totalPrices.ToString();
            label10.Text = total.ToString();
        }

        private void 賭球那點事_Load(object sender, EventArgs e)
        {
            cmbType.Items.AddRange(new object[] { "正常計算", "內馬爾進球", "點球大戰" });
            cmbType.SelectedIndex = 0;
        }
    }
}



運行:

假如巴西3:2智利,內馬爾有進球,則:


這場賭球風波到底結局如何,再過幾個小時就知道了!



發佈了49 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章