为什么要用设计模式?

1、设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上。

2、设计模式使程序易读。熟悉设计模式的人应该能够很容易读懂运用设计模式编写的程序。

3、设计模式能使编写的程序具有良好的可扩展性,满足系统设计的开闭原则。比如策略模式,就是将不同的算法封装在子类中,在需要添加新的算法时,只需添加新的子类,实现规定的接口,即可在不改变现有系统源码的情况下加入新的系统行为。

4、设计模式能降低系统中类与类之间的耦合度。比如工厂模式,使依赖类只需知道被依赖类所实现的接口或继承的抽象类,使依赖类与被依赖类之间的耦合度降低。

5、设计模式能提高代码的重用度。比如适配器模式,就能将系统中已经存在的符合新需求的功能代码兼容新的需求提出的接口 。

6、设计模式能为常见的一些问题提供现成的解决方案。

7、设计模式增加了重用代码的方式。比如装饰器模式,在不使用继承的前提下重用系统中已存在的代码。

目前总结的设计模式有23种使用广泛 ,我们先谈简单工厂模式,光讲定义很难明白的用法 ,我们引用一个案例 ,然大家更好的明白简单设计模式。

案例:模拟写一个计算器,你可能很快的写出如下代码:

namespace ConsoleAllTest
{
public class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; }

public virtual double GetResult()
{
double result = 0;
return result;
}
}

public class OperationAdd : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}

public class OperationSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}

public class OperationMulti : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}

public class OperationDiv : Operation
{
public override double GetResult()
{
if (NumberB==0)
{
throw new Exception("除数不能为0!");
}
else
{
double result = 0;
result = NumberA / NumberB;
return result;
}
}
}

工厂类:

public class OperationFactory
{
public static Operation createOperation(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMulti();
break;
case "/":
oper = new OperationDiv();
break;
default:
break;
}
return oper;
}
}
}

现在,我们只需要输入运算符,实例出相应的类就能实现计算器的结果:

     Operation oper = new Operation();
oper = OperationFactory.CreateOperate("+");
oper.NumberA = 1;
oper.NumberB = 2; double result=oper.GetResult();

如果我们需要加入什么新运算,只需要添加子类就可以了,加分支和改界面都和运算类没关系了!

简单工厂模式的类图:

总结:virtual虚函数主要作用是子类可以继续父类,也可以重写(override)父类方法。比如学习一种方法,觉得不合理,就不继承此方法,重写一种新的方法即可。

最新文章

  1. centos配置epel
  2. disconf安装部署
  3. i++为什么没有自增探析——JVM中i++的实现(转)
  4. JS正则表达式使用方法及示例
  5. 【制作镜像】安装VMwareTool
  6. 透过Extjs学习JavaScript---闭包篇
  7. Python即时网络爬虫项目: 内容提取器的定义
  8. 谁有SMI-S Provider的一些源码,能参考一下吗
  9. C#生成随机验证吗例子
  10. python邮件SMTP的GUI编程
  11. 博客系统(cnblog)
  12. python学习Day11 函数的参数列表
  13. Oracle EBS when-validate-record 个性化无效果
  14. PHP把采集抓取网页的html中的的 去掉或者分割成数组
  15. Java常见异常:Exception in thread "main" java.lang.NoClassDefFoundError
  16. k8s+Jenkins+GitLab-自动化部署asp.net core项目
  17. linux分享二:Linux如何修改字符集
  18. 打包dll发布到nuget服务器
  19. 专题实验 EXP & IMP
  20. poj_3352 连通图的桥

热门文章

  1. php运行机制初探
  2. CG中的数据变量类型
  3. mybatis+spring事务
  4. 缩短url-url短地址链接
  5. 自动化运维 Ansible
  6. Delphi获取文件的大小(实际&物理)
  7. Cdoefroces #354
  8. MySQL的char和varchar
  9. 【转】分享一份C语言写的简历
  10. svn 几个好用的命令