用简单工厂设计模式实现WinForm计算器

后台代码:

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

namespace CalclatorTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //界面加载的时候显示加减乘除符号
            cbo.Items.Add("+");
            cbo.Items.Add("-");
            cbo.Items.Add("*");
            cbo.Items.Add("/");
        }

        private void btnResult_Click(object sender, EventArgs e)
        {
            //cbo.SelectedItem获取当前选定的项 返回值是object的 需要做下显示转换为string类型的
            string fuhao = (string)cbo.SelectedItem;
            //调用工厂这个静态方法去选择用哪个计算器,返回一个计算器的类型引用
           Cale cale = Factory(fuhao);
           double num1=Convert.ToDouble(txtNum1.Text);
            double num2=Convert.ToDouble(txtNum2.Text);
            //通过计算器对象的引用调用对应的方法 体现多态的思想
            lblResult.Text = cale.GetResult(num1, num2).ToString();
        }

        static Cale Factory(string fuhao)
        {
            Cale cale=null;
            switch (fuhao)
            { 
                case "+":
                    cale = new AddCale();
                    break;
                case "-":
                    cale = new SubCale();
                    break;
                case "*":
                    cale = new MultiCale();
                    break;
                case "/":
                    cale = new DivCale();
                    break;
            }
            return cale;
        }

        private void txtNum1_KeyPress(object sender, KeyPressEventArgs e)
        {
            //在数字文本框中按下按键的时候触发事件
            char key = e.KeyChar;//e为事件提供参数
            if (key >= 48 & key <= 57 || key == 8) //判断是不是字母A-Z 或退格键
            {

            }
            else
            {
                e.Handled = true;  //否则无法录入
            }
        }

        private void txtNum2_KeyPress(object sender, KeyPressEventArgs e)
        {
            char key = e.KeyChar;
            if (key >= 48 & key <= 57 || key == 8)
            {

            }
            else
            {
                e.Handled = true;
            }
        }

    }

    abstract class Cale
    {
        public double Num1
        {
            get;
            set;
        }
        public double Num2
        {
            get;
            set;
        }
        public abstract double GetResult(double num1,double num2);
    }

    class AddCale:Cale
    {
        public override double GetResult(double num1, double num2)
        {
            return num1 + num2;
        }
    }

    class SubCale : Cale
    {
        public override double GetResult(double num1, double num2)
        {
            return num1 - num2;
        }
    }

    class MultiCale : Cale
    {
        public override double GetResult(double num1, double num2)
        {
            return num1 * num2;
        }
    }

    class DivCale : Cale
    {
        public override double GetResult(double num1, double num2)
        {
            return num1 / num2;
        }
    }
}

压缩文件:Cale.rar

posted @ 2013-04-04 00:45  IT浪潮之巅  阅读(365)  评论(0编辑  收藏  举报
   友情链接: 淘宝优惠券