zoukankan      html  css  js  c++  java
  • 大话设计模式 第二章:策略模式

      策略模式(strategy):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到试用算法的客户。

      本文章是的工厂模式和策略模式的结合例子:

    1,定义现金抽象类:

        /// <summary>
        /// 现金父类
        /// </summary>
        public abstract class CashSuper
        {
            /// <summary>
            /// 将原价转为返回价
            /// </summary>
            /// <param name="money">原价</param>   
            public abstract double acceptCash(double money);
        }

    2,定义各个算法类,全部继承自现金父类:

    View Code
        /// <summary>
        /// 没有活动的现金类
        /// </summary>
        public class CashNormal : CashSuper
        {
            public override double acceptCash(double money)
            {
                return money;//直接返回原价           
            }
        }    
        /// <summary>
        /// 打折类
        /// </summary>
        public class CashRebate : CashSuper
        {
            private double rebate = 1.0;//打几折
            public CashRebate(double rebate)
            {
                this.rebate = rebate;
            }
            public override double acceptCash(double money)
            {
                double result = 0.0;
                result = money * rebate;
                return result;
            }
        }
        /// <summary>
        /// 返回现金类
        /// </summary>
        public class CashReturn : CashSuper
        {
            private double moneyCondition;//满多少钱
            private double moneyReturn;   //返多少钱
            public CashReturn(double moneyCondition, double moneyReturn)
            {
                this.moneyCondition = moneyCondition;
                this.moneyReturn = moneyReturn;
            }
            public override double acceptCash(double money)
            {
                double result = 0.0;
                result = money - Math.Floor(money / moneyCondition) * moneyReturn;
                return result;
            }
        }

    3,定义现金上下文类,决定使用哪一种算法,并实例化哪个算法对象,这是工厂模式与策略模式的结合:

    View Code
        /// <summary>
        /// 现金上下文,选择哪种活动方式
        /// </summary>
        public class CashContext
        {
            private CashSuper cash=null;
            /// <summary>
            /// 根据活动方式返回价格
            /// </summary>
            /// <param name="type">活动方式(如:打8折)</param>
            public CashContext(string type)
            {
                switch (type)
                {
                    case "正常收费":
                        cash = new CashNormal();
                        break;
                    case "打8折":
                        cash = new CashRebate(0.8);
                        break;
                    case "满300返100":
                        cash = new CashReturn(300, 100);
                        break;
                    default:
                        throw new  Exception("没有该活动");
                }                   
            }
            /// <summary>
            /// 输入原价返回价格
            /// </summary>
            /// <param name="money">原价</param>    
            public double GetResult(double money)
            {
               return cash.acceptCash(money);
            }
        }

    4,客户端界面的设计:

    5,客户端后台代码:

    View Code
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            double total = 0.0;
            private void buttonOK_Click(object sender, EventArgs e)
            {
                try
                {
                    double totalPrice = 0.0;
                    CashContext cashContext = new CashContext(this.comboBox1.Text);
                    totalPrice = cashContext.GetResult(Convert.ToDouble(textBoxPrice.Text) * Convert.ToDouble(textBoxNum.Text));
                    string resutl = "单价:" + textBoxPrice.Text + " 数量:" + textBoxNum.Text + " 活动方式:" + comboBox1.SelectedText + " 总价:" + totalPrice.ToString();
                    listBox1.Items.Add(resutl);
                    total += totalPrice;
                    this.labelTotal.Text = total.ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);         
                }
                
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string[] type = new string[] { "正常收费", "打8折", "满300返100" };
                this.comboBox1.Items.AddRange(type);         
            }
        }
  • 相关阅读:
    git 常用命令
    PHP打印日志类
    如何从总账获取分类账信息
    AP -> GL 数据流动
    JDeveloper 速度慢问题
    JDeveloper 滚轮不受控制
    MyBatis 环境搭建
    初识 MyBatis
    Linux 中设置 MySQL 字符集为 UTF-8
    Linux 安装 MySQL 详解(rpm 包)
  • 原文地址:https://www.cnblogs.com/wang7/p/2681393.html
Copyright © 2011-2022 走看看