引言 |
面向对向程序设计的三大特征是: 封装,继承,多态
平时做设备的程序用得最多的还是封装,或者还有一些基于局部功能性的继承。真心来说程序仅仅是为了实现功能,还远远谈不上真正的是面向对象开发。
当然这也是有原因的:
一方面,设计模式并不是直接写出来的,而是重构代码改出来的(至少勇哥是这么认为的)。在完成了设备功能的情况下,往往因为时间关系,不可能再重构代码,因为当设备开始进行生产状态后,客户认为再去动代码是有风险的。
另一方面,人还是有惰性,当初研究面向对象、设计模式的时候的那股劲随着被工作不断打断后,慢慢淡化下来了,我想如果勇哥可以不出差,一直在公司做标准设备的话,也许这股冲劲会更持久一些。
面向对象、设计模式这些知识的实践,是由一个程序菜鸟达到凤凰涅盘的关键过程,之后写出来的代码会达到艺术化并且兼顾实用性的一种境界,这个境界想想都令人激动万分。
勇哥想借助于这个网站,把这些知识重温起来,虽然时间有限,但是缓慢地,用心并持续下去,还是可能圆梦初心的。
下演示程序是关于设计模式“简单类工厂”。
看上去很简单,但是其中包含的思想已经用到了面向对象的全部特征。
勇哥在后面会附上原书的关键部分的内容,各位读过以后再看演示程序收获会大许多。
测试代码:
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 calculate { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); btnCal.Click += new EventHandler(btnCal_Click); } void btnCal_Click(object sender, EventArgs e) { double numA, numB; if (double.TryParse(this.tbNumA.Text, out numA) && double.TryParse(this.tbNumB.Text, out numB)) { operFactory factory = new operFactory(cbbSymbol.Text,numA,numB); label1.Text = factory.getResult().ToString(); } } void Form1_Load(object sender, EventArgs e) { cbbSymbol.Items.Add("+"); cbbSymbol.Items.Add("-"); cbbSymbol.Items.Add("*"); cbbSymbol.Items.Add("/"); cbbSymbol.SelectedIndex = 0; } } public class operFactory { private operation op = null; private double _numa; public double Numa { get { return _numa; } set { _numa = value; } } private double _numb; public double Numb { get { return _numb; } set { _numb = value; } } public operFactory(string symbol,double numa,double numb) { this._numa = numa; this._numb = numb; switch (symbol) { case "+": op = new add(); break; case "-": op = new sub(); break; case "*": op = new mul(); break; case "/": op = new div(); break; default: break; } } public double getResult() { if (op != null) { op.NumberA = this._numa; op.NumberB = this._numb; return op.calResult(); } else return 0; } } public class operation { private double _numberA; public double NumberA { get { return _numberA; } set { _numberA = value; } } private double _numberB; public double NumberB { get { return _numberB; } set { _numberB = value; } } public virtual double calResult() { return 0; } } public class add : operation { public override double calResult() { return NumberA + NumberB; } } public class sub : operation { public override double calResult() { return NumberA - NumberB; } } public class mul : operation { public override double calResult() { return NumberA * NumberB; } } public class div : operation { public override double calResult() { return NumberA / NumberB; } } }
本文主题的起因
小菜的程序是这样的:
小菜的程序是过程式的写法,没有理解面试单位的的要求,对方是要求用面向对象的设计方式来写代码。
大鸟由此介绍了面向对象设计方法的好处,以及提出一个新要求,引导小菜往面向对象的思维方式上去想:
经过启发,小菜写出了第一版面向对象的程序:
客户端代码:
由于小菜这一版程序只用到了面向对象中的“封装”,所以继续引导他,假设客户增加需求的时候该怎么办?
小菜经过考虑,写出了一版利用上了继承和多态的代码
Operation运算类
这个代码引出了一个新的问题,这个问题引出了本文的主题,一种设计模式“简单类工厂”

