前提摘要:
今天晚上世界盃進行淘汰賽,一場重頭戲是巴西隊和智利隊。小華是內馬爾的粉絲,他希望巴西隊能贏,小玉認爲智利隊是黑馬,能贏巴西隊。於是二人打賭,賭資爲每個球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智利,內馬爾有進球,則:
這場賭球風波到底結局如何,再過幾個小時就知道了!