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

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

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

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

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

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

 
利用多态实现

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:\rtf";//保存文件路径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() + " " + "\n";RicRight.Text += txtone.Text + typ1.Text + txttwo.Text + label3.Text + txtresult.Text + " " + "✔☺" + "\n";}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() + " " + "\n";RicFault.Text += txtone.Text + typ1.Text + txttwo.Text + label3.Text + txtresult.Text + " " + "✘☹" + "\n";}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 + "" + "\n";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 + "正确√" +""+ "\n";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 + "错误×" + "" + "\n";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;}

截图




转载于:https://www.cnblogs.com/missing-cat/p/5001844.html

计算—工厂模式模式(练习)相关推荐

  1. 设计模式之工厂方法模式学习笔记

    定义 定义一个用于创建对象的接口,让子类去决定是实现哪个类.工厂方法使类的实例化,延迟到了子类. 结构图 角色拆解分析: 1.Product:抽象产品类 2.ConcrereProduct:具体产品类 ...

  2. 设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  3. 数据库实现,以及工厂方法模式实现

    计算类的定义 using System; using System.Collections.Generic; using System.Linq; using System.Text;namespac ...

  4. 一天一种设计模式之六-----工厂方法模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.工厂方法模式 工厂方法模式属于创建型模式. 工厂方法模式定义:定义一个用于创建对象的借口,让子类决定实例化哪一个类.工厂方 ...

  5. 简单工厂模式+工厂方法模式

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  6. JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  7. 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  8. 工厂方法模式的一种特例——简单工厂模式

    工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步 ...

  9. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  10. 工厂方法模式、简单工厂模式、抽象工程模式

    1.概述 工厂设计模式是一种创建型模式,它提供了一种创建对象的最佳方式.在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 1.1. 针对的问题 在 ...

最新文章

  1. Swift基础--调用第三方OC项目
  2. JAVA线程间的状态转换
  3. C++插入排序(附完整源码)
  4. 辅助驾驶等级_双AMR电机位置传感器,助力自动驾驶安全出行
  5. Git在windows环境下的使用教程
  6. 在固态硬盘上安装win7后没有声音
  7. rhel7 ifconfig command not found
  8. LINUX使用OpenSSL进行签名
  9. 数学分析教程(第三版)读后感
  10. ROI Pool、ROI Align、PSROI Pool、PrROI Pool
  11. IPTV的开展在广电企业、电信运营商角度上的异同
  12. 06.输入系统:第10课第20节_输入系统_多点触摸_电容屏驱动程序
  13. 项目csv文件 利用Excel分列功能 求和
  14. APMServ启动失败解决方法
  15. 五年北京,这个改变我命运的城市,终于要离开了(转)
  16. 最小费用最大流(详解+模板)
  17. EXCEL 正则表达式
  18. python文件定位函数_python 文件和路径操作函数小结
  19. python做工控机_[Micropython]TPYBoard v202 利用单片机快速实现家庭智能控制平台
  20. 负载均衡之HAProxy——种种

热门文章

  1. 【java工具类-抓取图片】正则抓取内容里面的j图片,正则,图片替换格式处理图片java处理文章内容里面的图片格式化工具类,能够最大限度的自动是被图片IMG标签和java使用正则抓取图片说明
  2. 创新创业竞赛管理系统
  3. 如何删除iphone中的文稿与数据
  4. jQuery 实现模糊查询
  5. CSS —— 常用效果(一)(纯 CSS)
  6. 【18】[C语言]抓交通肇事犯。一辆卡车违反交通规则,撞人后逃跑。现场有3人目击事件,但没有记住车牌号,只记住了车号的一些特征。
  7. 梯度下降参数不收敛_一文讲透梯度下降
  8. org.xml.sax.SAXParseException 文档根元素 mapper 必须匹配 DOCTYPE 根 configuration
  9. Linux系统VCS相关小白操作--lab0
  10. 清除linux内存buff/cache