zoukankan      html  css  js  c++  java
  • 计算—工厂模式模式(练习)

         对于策略模式和工厂模式我可以说是还很迷糊的。我查了资料。有人这样区分它们,也举了很形象的例子,想想其实也是这样一个道理。

      一般情况下,策略模式解决的是策略的切换与扩展,更简洁的说是定义策略族(我也有点儿不懂),分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。可以应用的场景有优惠系统、工资计算系统等。而工厂模式主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。

    很明显的是策略模式是开放的,作为一个主体的我们的活动范围是全程的,大多数事情要你自己亲力亲为。

    而工厂模式作是封闭的,作为主体的我们的活动范围是有限的,很多事情提前帮你做好了。我们便可以直接使用了。

      这是这几天在错误中摸索,在资料中查询的结果。继续查找,继续理解。

    就说我的这个计算器。试着选择用多态简单的工厂模式,这样就可以说客户可以直接运行,而不用再亲自进行一些不必要的过程。完善中,,,,

     
    利用多态实现
    Calculate计算类;
    
    public  class Calculate    
        {
            private double a;//第一个数
    
            public double A//封装字段
            {
                get { return a; }
                set { a = value; }
            }
            private double b;//第二个数字段封装
    
            public double B
            {
                get { return b; }
                set { b = value; }
            }
            public double result;
            public virtual double Result()//利用多态实现简单工厂模式
            {
                return result;
            }
    
        }
        public class Add : Calculate//派生加法类
        {
            public override double Result()//重写基类中的方法,进行计算
            {
                result = A + B;
                return result;
            }
        }
        public class Sub : Calculate
        {
            public override double Result()
            {
                result = A - B;
                return result;
            }
        }
        public class Mul : Calculate
        {
            public override double Result()
            {
                result = A * B;
                return result;
            }
    
        }
        public class Div : Calculate
        {
            public override double Result()
            {
                if (A == 0)
                {
                    MessageBox.Show("分母不能为零");
                }
                result = A / B;
                return result;
    
            }
        }
        public class Mod : Calculate
        {
            public override double Result()
            {
                if (A == 0)
                {
                    MessageBox.Show("分母不能为零");
                }
                result = A % B;
                return result;
    
            }
    
    
        }
        public class calculate//运算类型
        {
            public static Calculate Cal(string type)//派生一个为Calculate类型的Cal
            {
                Calculate cal = null;switch (type)
                {
                    case "+":
                        cal = new Add();    //加法
                        break;
                    case "-":
                        cal = new Sub();
                        break;
                    case "*":
                        cal = new Mul();
                        break;
                    case "/":
                        cal = new Div();
                        break;
                    case "%":
                        cal = new Mod();
                        break;
                    default:
                        break;
                }
                return cal;
    
            }
        }
    }
    数据库定义了一个Sqltest类
    namespace WFCaclualtor
    {
       public  class Sqltest
        {
        
            public string strCon = @"Data Source=.;Initial Catalog=stuDb;Integrated Security=True";
            public SqlConnection sqlCon = new SqlConnection();
            public SqlDataAdapter sda = new SqlDataAdapter();
            public DataSet ds = new DataSet();
            public DataTable dt = new DataTable();
            public SqlDataReader sdr;
            public void dbcon()
            {
                try
                {
                    sqlCon = new SqlConnection(strCon);
                }
                catch (Exception e)
                {
                    MessageBox.Show("数据库连接不成功:" + e.ToString());
                }
            }
            public void dbFill(string selstr)
            {
                dt.Clear();
                sda = new SqlDataAdapter(selstr, strCon);
                sda.Fill(ds, "test");
                dt = ds.Tables["test"];
            }
            public void dbSelect(string showInfo)
            {
                sqlCon.Open();
                SqlCommand sqlcmd = new SqlCommand(showInfo, sqlCon);
                sdr = sqlcmd.ExecuteReader();
            }
            public void dbInsert(string insertInfo)
            {
                sqlCon.Open();
                SqlCommand sqlcmd = new SqlCommand(insertInfo, sqlCon);
                try
                {
                    sqlcmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    MessageBox.Show("数据插入失败" + e.ToString());
                }
                sqlCon.Close();
            }
            public void dbGridViewUpd()
            {
                SqlCommandBuilder scb = new SqlCommandBuilder(sda);
                DialogResult result;
                result = MessageBox.Show("确定保存修改过的数据吗?", "操作提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (result == DialogResult.OK)
                {
                    dt = ds.Tables["test"];
                    sda.Update(dt);
                    dt.AcceptChanges();
                }
            }
            public void dbUpdate(string updStr)
            {
                sqlCon.Open();
                SqlCommand sqlcmd = new SqlCommand(updStr, sqlCon);
                try
                {
                    sqlcmd.ExecuteNonQuery();
                    MessageBox.Show("数据修改成功!");
                }
                catch (Exception e)
                {
                    MessageBox.Show("数据库修改失败" + e.ToString());
                }
                sqlCon.Close();
            }
            public void dbDelete(string delStr)
            {
                sqlCon.Open();
                SqlCommand sqlcmd = new SqlCommand(delStr, sqlCon);
                try
                {
                    sqlcmd.ExecuteNonQuery();
                   // MessageBox.Show("数据删除成功!");
                }
                catch (Exception e)
                {
                    MessageBox.Show("数据删除失败" + e.ToString());
                }
                sqlCon.Close();
            }
        }
    }
    
    
    Form1代码Window窗体
    namespace WFCaclualtor
    {
        public partial class Form1 : Form
        {
            Sqltest db = new Sqltest();//-----实例数据库一个对象进行对数据库的操作
            public static int question = 0;
            public static int right = 0;
            public static int fault = 0;
            public static int t = 0;
            public static int n = 0;
            public string path = "C:
    tf";//保存文件路径
            public Form1()
            {
    
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                // TODO: 这行代码将数据加载到表“stuDbDataSet.test”中。您可以根据需要移动或删除它。
                this.testTableAdapter.Fill(this.stuDbDataSet.test);
                // TODO: 这行代码将数据加载到表“stuDbDataSet.test”中。您可以根据需要移动或删除它。
                // this.testTableAdapter.Fill(this.stuDbDataSet.test);
                label10.Visible = true;
                label12.Visible = true;
                decriptionbt.Visible = true;
                txtresult.Visible = false;
                saveBt.Visible = false;
                openbt.Visible = false;
    
            }
            private void time_Tick(object sender, EventArgs e)
            {
                txtresult.Visible = true;
                t = Convert.ToInt32(txtTime.Text);
                time.Interval = 1000;
                if (t <= 0)
                {
                    time.Enabled = false;
                    MessageBox.Show("时间到!");
                    Form2 frm2 = new Form2();
                    frm2.ShowDialog();
                }
                t = t - 1;
                txtTime.Text = t.ToString();
    
            }
    
            private void Starbut_Click(object sender, EventArgs e)
            {
                if (txtTime.Text == "")
                {
                    MessageBox.Show("请输入计算时间");
    
                }
                else
                {
                    txtresult.Enabled = true;
                    if (ComChoosetxt.Text == "txt文件")
                    {
                        time.Start();
                        string[] type = new string[100];
    
                        type = File.ReadAllLines("type.txt");
                        typ1.Text = type[n];
    
                        string[] one = new string[100];
                        one = File.ReadAllLines("one.txt");
                        txtone.Text = one[n];
    
                        string[] two = new string[100];
                        two = File.ReadAllLines("two.txt");
                        txttwo.Text = two[n];
                        n++;
                    }
    
                    else
                    {
    
                        MessageBox.Show("请选择做题方式!");
                    }
                }
            }
    
            //——————————————————————开始答题
    
            private void txtresult_KeyDown(object sender, KeyEventArgs e)
            {
                
                string typ = typ1.Text.Trim();//调用类成员
                // 多态
               GetCalculate cal;
               cal = InCalculate.Cal(typ)
               cal.A = Convert.ToDouble(txtone.Text.Trim());
               cal.B = Convert.ToDouble(txttwo.Text.Trim());
               double result= cal.Result();
    if (e.KeyCode == Keys.Enter) { if (txtresult.Text == result.ToString())//txtresult="7" result=0? { MessageBox.Show("计算正确"); right++; LaRigth.Visible = true; RicRight.Visible = true; // RicFault.Text += db.dt.Rows[0][0].ToString() + db.dt.Rows[0][1].ToString() + db.dt.Rows[0][2].ToString() + " " + " "; RicRight.Text += txtone.Text + typ1.Text + txttwo.Text + label3.Text + txtresult.Text + " " + "✔☺" + " "; } else { MessageBox.Show("计算错误继续努力"); fault++; RicFault.Visible = true; LaFault.Visible = true; //RicFault.Text += db.dt.Rows[0][0].ToString() + db.dt.Rows[0][1].ToString() + db.dt.Rows[0][2].ToString() + " " + " "; RicFault.Text += txtone.Text + typ1.Text + txttwo.Text + label3.Text + txtresult.Text + " " + "✘☹" + " "; } question++; txtone.Clear(); typ1.Clear(); txttwo.Clear(); txtresult.Clear(); } }//---------------------------------判断计算情况 private void removebt_Click(object sender, EventArgs e) { switch (ComChoosetxt.Text) { case "SQL数据库": db.dbcon(); string sqlDeltest = "delete from test where ID='" + ComtestID.Text.ToString().Trim() + "'"; txtone.Clear(); typ1.Clear(); txttwo.Clear(); MessageBox.Show("删除成功"); db.dbDelete(sqlDeltest); break; case "txt文件": File.WriteAllText("one.txt", string.Empty); File.WriteAllText("two.txt", string.Empty); File.WriteAllText("type.txt", string.Empty); MessageBox.Show("题目已清空请重新出题"); richTextBox1.Clear(); break; default: break; } } //----------------------------------------删除题目 private void Nexttest_Click(object sender, EventArgs e) { switch (ComChoosetxt.Text) { case "txt文件": FiletestMethod(); break; case "SQL数据库": db.dbcon(); //向数据库中输入数据 string strIntest = "insert into test(ID,one,type,two)values('" + ComtestID.Text + "','" + txtone.Text + "','" + typ1.Text + "','" + txttwo.Text + "')"; txtone.Clear(); typ1.Clear(); txttwo.Clear(); MessageBox.Show("请出下一题"); db.dbInsert(strIntest); break; default: break; } richTextBox1.Visible = true; txtone.Clear(); typ1.Clear(); txttwo.Clear(); } //---------------------------------------出题 private void saveBt_Click(object sender, EventArgs e) { //----------------定义一个用来保存文件的对话框 SaveFileDialog TxtSaveDialog = new SaveFileDialog(); //--------------设置保存文件的过滤参数 TxtSaveDialog.Filter = "RTF文件(*.RTF)|*.RTF"; //--------------------对于文件是否存在进行判断,另外给出相应的解决措施 if (File.Exists(path)) { this.richTextBox1.LoadFile(path, RichTextBoxStreamType.RichText); MessageBox.Show("保存成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); this.richTextBox1.Clear(); } else { if (TxtSaveDialog.ShowDialog() == DialogResult.OK) { this.richTextBox1.SaveFile(TxtSaveDialog.FileName, RichTextBoxStreamType.RichText); MessageBox.Show("保存成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); this.richTextBox1.Clear(); } } }//保存文件中的题目 private void openbt_Click(object sender, EventArgs e) { //------------------------声明一个打开对话框 OpenFileDialog txtOpen = new OpenFileDialog(); txtOpen.Filter = "RTF文件(*.RTF)|*.RTF"; if (txtOpen.ShowDialog() == DialogResult.OK) { //打开保存文件的路径 path = txtOpen.FileName; this.richTextBox1.LoadFile(txtOpen.FileName, RichTextBoxStreamType.RichText); saveBt.Enabled = false; openbt.Enabled = false; MessageBox.Show("读取成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } }//打开文件中的题目 private void ComtestID_SelectedIndexChanged_1(object sender, EventArgs e) { if (txtTime.Text == "") { MessageBox.Show("请输入计算时间"); } else { time.Start(); db.dbcon(); string sqlSetest = "select one,type,two from test where ID='" + ComtestID.Text.ToString().Trim() + "'"; db.dbSelect(sqlSetest); while (db.sdr.Read()) { txtone.Text = db.sdr["one"].ToString().Trim(); typ1.Text = db.sdr["type"].ToString().Trim(); txttwo.Text = db.sdr["two"].ToString().Trim(); } } }////------------------通过选择题目将题从数据中导入到文本框中 private void ComChoosetxt_SelectedIndexChanged(object sender, EventArgs e) { switch (ComChoosetxt.Text) { case "SQL数据库": label4.Visible = true; label7.Visible = true; ComtestID.Visible = true; Nexttest.Visible = true; openbt.Visible = false; saveBt.Visible = false; Starbut.Enabled = false; break; case "txt文件": label4.Visible = false; label7.Visible = false; ComtestID.Visible = false; Nexttest.Visible = true; openbt.Visible = true; saveBt.Visible = true; Starbut.Enabled = true; break; default: ComChoosetxt.Text = "请选择存题方式"; break; } }//选择计算方式 private void FiletestMethod() { txtresult.Enabled = false; StreamWriter one = File.AppendText("one.txt"); one.WriteLine(txtone.Text); one.Close(); StreamWriter ty1 = File.AppendText("type.txt"); ty1.WriteLine(typ1.Text); ty1.Close(); StreamWriter two = File.AppendText("two.txt"); two.WriteLine(txttwo.Text); two.Close(); //type = typ1.Text; richTextBox1.Text += txtone.Text + typ1.Text + txttwo.Text + label3.Text + "" + " "; txtone.Clear(); typ1.Clear(); txttwo.Clear(); } //自定义方法将将题目利用File对象写入文件中 private void Overbtn_Click(object sender, EventArgs e) { Form2 fm2 = new Form2(); fm2.ShowDialog(); }//-----------------------------------退出程序,计算结束 private void Closebt_Click(object sender, EventArgs e) { MessageBox.Show("谢谢使用<☺>"); Application.Exit(); }//中断或者停止答题,给出计算情况 private void decriptionbt_Click(object sender, EventArgs e) { label10.Visible = false; decriptionbt.Visible = false; label12.Visible = false; } }
    
    

    图示:

     



    WPF应用程序


    WPF代码

    /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public static int question = 0;
            public static int right = 0;
            public static int t;
            public static string type = "";
            public static double result = 0;
            public int n = 0;//文件中的数据   
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void txtresult_KeyDown(object sender, KeyEventArgs e)
            {
                Calculate cal=null;string typ = typ1.Text.ToString();//调用类成员
                cal = calculate.Cal(typ);
                cal.A = Convert.ToDouble(txtone.Text);
                cal.B= Convert.ToDouble(txttwo.Text);
                string result = Convert.ToString(cal.Result());
            if (e.Key==Key.Enter)
                {
    
                    if (txtresult.Text == cal.result.ToString())
                    {
                        
                        righttxt.Visibility = Visibility.Visible;
                        righttxt.Text += txtone.Text + typ.Text + txttwo.Text +Li.Content+ txtresult.Text + "正确√" +""+ "
    ";
                        MessageBox.Show("回答正确");
                        txtone.Text = "";
                        txttwo.Text = "";
                        //txtthree.Text = "";
                        txtresult.Text = "";
                        typ.Text = "";
                        //typ2.Text = "";
                        question++;
                        
                    }
                        
                    else
                    {
                        MessageBox.Show("回答错误");
                        
                        faulttxt.Visibility = Visibility.Visible;
                        faulttxt.Text += txtone.Text + typ.Text + txttwo.Text + Li.Content + txtresult.Text + "错误×" + "" + "
    ";
                        txtone.Text = "";
                        txttwo.Text = "";
                        //txtthree.Text = "";
                        txtresult.Text = "";
                        typ.Text = "";
                        //typ2.Text = "";
                    }
                    question++;
                }
                
    
            }
        }
    }

    截图
    
    
    
    
    
    
    ASP.net

    Calculate计算类;

    
    
    public  class Calculate    //抽象类 Calculate
        {
            private double a;//第一个数
    
            public double A//封装字段
            {
                get { return a; }
                set { a = value; }
            }
            private double b;//第二个数字段封装
    
            public double B
            {
                get { return b; }
                set { b = value; }
            }
            public double result;
            public virtual double Result()
            {
                return result;
            }
    
        }
        public class Add : Calculate
        {
            public override double Result()
            {
                result = A + B;
                return result;
            }
        }
        public class Sub : Calculate
        {
            public override double Result()
            {
                result = A - B;
                return result;
            }
        }
        public class Mul : Calculate
        {
            public override double Result()
            {
                result = A * B;
                return result;
            }
    
        }
        public class Div : Calculate
        {
            public override double Result()
            {
                if (A == 0)
                {
                    MessageBox.Show("分母不能为零");
                }
                result = A / B;
                return result;
    
            }
        }
        public class Mod : Calculate
        {
            public override double Result()
            {
                if (A == 0)
                {
                    MessageBox.Show("分母不能为零");
                }
                result = A % B;
                return result;
    
            }
    
    
        }
        public class calculate
        {
            public static Calculate Cal(string type)
            {
                Calculate cal =null;
                switch (type)
                {
                    case "+":
                        cal = new Add();    //加法
                        break;
                    case "-":
                        cal = new Sub();
                        break;
                    case "*":
                        cal = new Mul();
                        break;
                    case "/":
                        cal = new Div();
                        break;
                    case "%":
                        cal = new Mod();
                        break;
                    default:
                        break;
                }
                return cal;
    
            }
        }
    }



    后台代码
     protected void calcilate_Click(object sender, EventArgs e)
        {
            Calculate cal = null;string typ = DDLtype.SelectedValue.ToString();//调用类成员
            cal = calculate.Cal(typ);//运算类型
            cal.A = Convert.ToDouble(one.Text);//第一个数
            cal.B = Convert.ToDouble(two.Text);//第二个数
            string answer = Convert.ToString(cal.Result());//答案
            if (result.Text == answer.ToString())//判断计算结果
            {
                Response.Write("<script>alert('回答正确')</script>");
                Panel1.GroupingText = one.Text + DDLtype.SelectedValue + two.Text + Label1.Text + result.Text;//将题放入panel中
                one.Text = "";
                two.Text = "";
                result.Text = "";
                DDLtype.SelectedValue = "请选择计算类型";
                
            }
            else
            {
                Response.Write("<script>alert('回答错误')</script>");
                one.Text = " ";
                two.Text = " ";
                result.Text = " ";
                DDLtype.SelectedValue = "请选择计算类型";
                
            }
    
    
            Panel1.Visible = true;
            
    
        }

    截图




    
    
    
    
    







  • 相关阅读:
    解决 Windows 下的 :所选择的任务“{0}”不再存在。若要查看当前任务,请单击“刷新”。
    学习编译更好的 DAO 的技巧
    宇宙的起源演讲全文(斯蒂芬·霍金)
    java對象序列化的兩種使用方法
    Ubuntu硬盘安装与配置(3D效果)
    java異常處理
    [zt]JDBC对数据库的事务操作
    [zt]spring本地事务与JTA事务实现解析
    Debian溫習
    在oracle中增大session數量
  • 原文地址:https://www.cnblogs.com/missing-cat/p/5001844.html
Copyright © 2011-2022 走看看