前言:
(主要根据《大话设计模式》来学习)
作为一个不想尽快上手第二份工作的无业游民,为了提升自己的价值,于是想学下设计模式。
第一次接触设计模式这个概念,是在上学期间,老师介绍的,当时还让学了好几个模式,可当时愚蠢无知,没有用心,所以只是脑子里知道这个词。
目前来讲,我是这样理解设计模式的:
它是编程套路的总结,它有好几种套路即好几种模式。在编程即写代码时,运用设计模式可以让自己的代码具有比较好的可扩展性、可维护性以及可重复利用。至于具体怎么用,我倒是几乎没有什么经验,所以好处我也没体验过,哎~,当时无知,上一份工作期间又懒,故现在跟它只是“一面之缘”。至于为什么我认为它是我应该学的,因为在我目前需要加强或补充的知识中,它是比较容易做到的,而且这本书我之前有大概看了一章,感觉并不难理解还挺有趣、靠谱,几乎算是手把手的教了。另外,比较无脑的一个原因,曾经一老师介绍过,而他介绍过的许多东西在我工作期间都常用到,所以,我对他有个盲目的信任,故我想先学这个。
那么“设计模式”到底是个什么概念呢?【这里抽时间再补充,我记得有本书上有介绍,官方应该也可以搜到】
正文:
一:“代码的可维护性、可扩展性、可复用性”
应该是一句常听的的词,那具体的是怎么一回事呢?利用类比能比较很好的说明某个概念或问题,书中用的是“活字印刷术”来解释的,很有意思,我就把我get到的文绉绉的来表述一下:可维护性即代码某个地方不满足要求了,但能很快定位到是哪些代码段,并能换上新的代码,且改完后与其它代码不冲突,就好比给车换了一个轮子一样。可扩展性就是比如你的系统在后期需要加一个小功能,只要这个功能实现了某个接口就能在系统中流畅运行 。可复用性就是字面意思了,当在别的项目中实现类似功能时,你的代码可以直接copy过来用,或者你的代码可以实现在不同的场景下也能发挥作用等。
二:“编程有一个原则,就是尽量避免重复”。
还有,类图是个不错的东西,书上介绍的很详细了,可以了解下,但是去年工作一年,没有用到过,不清楚别处是怎样的一个情况。
三:简单工厂模式
概念:简单工厂模式就是用来处理实例化的问题。比如一个抽象类有好几个实现类,当你要根据不同的情况来获取不同的实例时,考虑用这个模式,当然,比如用switch也可以解决问题,但这样的话,每次实例化都是有个判断“1234”的过程,而简单工厂模式往往是一句代码就搞定了实例化的问题,有种“直达”的感觉。
四:示例代码
要求:使用任何一个面向对象语言,写一个控制台应用程序,要求根据两个数进行四则运算。
=>进行运算的类
/// <summary> /// 抽象类 /// </summary> public abstract class NumberOperate { public double NumberA { get; set; } public double NumberB { get; set; } public virtual double GetResult() { double result = 0; return result; } } public class NumberOperateAdd : NumberOperate { public override double GetResult() { return NumberA + NumberB; } } public class NumberOperateMinus : NumberOperate { public override double GetResult() { return NumberA - NumberB; } } public class NumberOperateMul : NumberOperate { public override double GetResult() { return NumberA * NumberB; } } public class NumberOperateDiv : NumberOperate { public override double GetResult() { return NumberA / NumberB; } }
=》progorm类:
using System; using System.Collections.Generic; using System.Text.RegularExpressions; namespace JiSuanQi { /// <summary> /// 工厂类 /// </summary> public class NumberOperateFactory { /// <summary> /// 工厂方法【通常是静态的、返回类型是抽象类或接口】 /// </summary> /// <param name="operateMark"></param> /// <returns></returns> public static NumberOperate CreateOperate(string operateMark) { NumberOperate currOperate = null; switch (operateMark) { case "+": currOperate = new NumberOperateAdd(); break; case "-": currOperate = new NumberOperateMinus(); break; case "*": currOperate = new NumberOperateMul(); break; case "/": currOperate = new NumberOperateDiv(); break; //如果想新增新的运算方式,要在下面追加相应的case //case "%": // currOperate = new NumberOperateDiv(); // break; default: //new NumberOperateFactory(); break; } return currOperate; } } /// <summary> /// 验证类 /// </summary> public class ValidateInput { /// <summary> /// 判断是输入的是否是实数 /// </summary> /// <param name="inputStr"></param> /// <returns></returns> public static bool IsNumber(string inputStr) { string pattern = "^(-)?[0-9]*(.)?[0-9]*$"; Regex regex = new Regex(pattern); return regex.IsMatch(inputStr); } /// <summary> /// 判断是否支持该运算符 /// </summary> /// <param name="operateMark"></param> /// <returns></returns> public static bool IsSupportOperate(string operateMark) { List<string> lsOperate = new List<string> { "+", "-", "*", "/" }; return lsOperate.Contains(operateMark); } } class Program { static void Main(string[] args) { Program program = new Program(); start: Console.WriteLine("根据输入的两个数,进行加、减、乘、除运算。\n 请输入第一个数:"); string firstStr = Console.ReadLine().Trim(); bool isNumber = ValidateInput.IsNumber(firstStr); while (isNumber == false) { Console.WriteLine("输入有误,请重新输入:"); firstStr = Console.ReadLine(); } double numberA = double.Parse(firstStr); Console.WriteLine("请输入运算符号(+、-、*、/):"); string operateMark = Console.ReadLine().Trim(); while (!ValidateInput.IsSupportOperate(operateMark)) { Console.WriteLine("输入有误,请输入运算符号(+、-、*、/):"); operateMark = Console.ReadLine().Trim(); } Console.WriteLine("根据输入的两个数,进行加、减、乘、除运算。\n 请输入第二个数:"); secondNum: string secondStr = Console.ReadLine(); isNumber = ValidateInput.IsNumber(secondStr); while (isNumber == false) { Console.WriteLine("输入有误,请重新输入:"); secondStr = Console.ReadLine(); } double numberB = double.Parse(secondStr); if (operateMark == "/" && double.Parse(secondStr) == 0) { Console.WriteLine("除数不能为零。\n 请输入第二个数:"); goto secondNum; } //这里运用工厂方法,根据参数不同,获取不同的对象。 NumberOperate currOperate = NumberOperateFactory.CreateOperate(operateMark); currOperate.NumberA = numberA; currOperate.NumberB = numberB; double result = currOperate.GetResult(); Console.WriteLine($"{numberA} {operateMark} {numberB} = {result}"); Console.ReadLine(); goto start; } } }
=》运行结果:
书中鸡汤:
‘编程是一门技术,更加是一门艺术,不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简练,更加容易维护,容易扩展和服用,只有这样才可以真正得到提高。’
发现:
通过这一章的学习,我发现自己的封装、继承、和多态几乎都忘了,只是有些隐隐的概念,需要下去补充,还有接口也快忘光了,因为过去一年我竟几乎没怎么用过。还有正则表达式,这个得熟练一下,之前写JS代码会常用到,后台代码有些时候也是有可能用到的。