• 二、策略模式之商场促销计价器


    1、创建一个窗体项目,窗体内控件如图所示:

    2、相应的类如下

    using System;
    
    namespace 商场促销_策略模式实现
    {
        // 现金收取超类的抽象方法,收取现金,参数为原价,返回为当前价
        abstract class CashSuper
        {
            public abstract double acceptCash(double money);
        }
        //正常收费,原价返回
        class CashNormal : CashSuper
        {
            public override double acceptCash(double money)
            {
                return money;
            }
        }
        //打折收费类,初始化时必须输入折扣率,如八折 0.8
        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;
            }
        }
        //返利收费类,初始化时必须要输入返利条件和返利值,如满300返100
        class CashReturn : CashSuper
        {
            private double moneyCondition = 0.0d;
            private double moneyReturn = 0.0d;
            public CashReturn(string moneyCondition, string moneyReturn)
            {
                this.moneyCondition = double.Parse(moneyCondition);
                this.moneyReturn = double.Parse(moneyReturn);
            }
            public override double acceptCash(double money)
            {
                double result = money;
                if (money >= moneyCondition)   //若满足返利条件,则减去返利值
                    result = money - Math.Floor(money / moneyCondition) * moneyReturn;
    
                return result;
            }
        }
    
        class CashContext
        {
            CashSuper cs;   //声明一个CashSuper
            //通过构造方法,传入具体的收费策略
            public CashContext(string type) //参数type为字符串,表示收费策略
            {
                switch (type)   //将实例化具体策略的过程由客户端转移到Context类中,即简单工厂的应用
                {
                    case "正常收费":
                        CashNormal cs0 = new CashNormal();
                        cs = cs0;
                        break;
                    case "满300返100":
                        CashReturn cs1 = new CashReturn("300","100");
                        cs = cs1;
                        break;
                    case "打八折":
                        CashRebate cs2 = new CashRebate("0.8");
                        cs = cs2;
                        break;
                }
            }
            //根据收费策略不同,获得计算结果
            public double GetResult(double money)
            {
                return cs.acceptCash(money);
            }
    
        }
    }

    3、窗体控件相关操作代码

     1 using System;
     2 using System.Windows.Forms;
     3 
     4 namespace 商场促销_策略模式实现
     5 {
     6     public partial class Form1 : Form
     7     {
     8         public Form1()
     9         {
    10             InitializeComponent();
    11         }
    12 
    13         double total = 0.0d;    //用于总计
    14 
    15         private void btnOk_Click(object sender, EventArgs e)
    16         {
    17             string strCashAccept = cbxType.Text;    //声明计价类型
    18             CashContext cc = new CashContext(cbxType.Text); //将选定的计价类型用于初始化对应的计价策略
    19             double totalPrice = 0d;
    20             totalPrice = cc.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtTotal.Text));   //根据计价策略计算得到结果
    21             total = total + totalPrice;
    22             lbxList.Items.Add("单价:" + txtPrice.Text + " 数量:" + txtTotal.Text + " " +    //显示计算得到的结果
    23                 cbxType.SelectedItem + "	合计:" + totalPrice.ToString());
    24             lblResult.Text = total.ToString();
    25         }
    26 
    27         private void btnClear_Click(object sender, EventArgs e)
    28         {
    29             txtPrice.Text = null;   //清空显示结果
    30             txtTotal.Text = null;
    31             lbxList.Items.Clear();
    32             lblResult.Text = null;
    33             total = 0d;
    34         }
    35     }
    36 }

    注:本文内容是《大话设计模式》一书阅读过程复写代码!

  • 相关阅读:
    postgres 错误duplicate key value violates unique constraint 解决方案
    Golang包管理工具之govendor的使用
    《算法竞赛进阶指南》0x26广搜变形 HDOJ3085 双向BFS
    《算法竞赛进阶指南》0x26广搜变形 POJ3635
    《算法竞赛进阶指南》0x26广搜变形 电路维修 01最短路问题
    《算法竞赛进阶指南》0x25广度优先搜索 推箱子游戏 双重BFS
    《算法竞赛进阶指南》0x25广度优先搜索 多源floodfill
    《算法竞赛进阶指南》0x25广度优先搜索 POJ3322 Bloxorz I
    NETCORE
    VUE- 异步等待方法嵌套
  • 原文地址:https://www.cnblogs.com/MeiToufu/p/14514167.html
Copyright © 2020-2023  润新知