设计模式(2)
上一篇日志、我们应用到了设计模式三大特性的封装、今天这一片我们继续研究程序设计的另几种比较优秀的特性。
在上面的程序中这款计算器只涉及了加、减、乘、除算法、现在我们要加一个平方根运算,我们的思路会是改动我们的计算类,在switch中加一个分支就行了,但是这样的话要让加减乘除的运算都得来参与编译,如果你一不小心,把加法运算改成了减法,这岂不是大大的糟糕。这还不是最主要的,看这个例子,如果公司要求你为公司的薪资管理系统做维护,原来只有技术人员(月薪),市场销售人员(底薪+提成),经理(年薪+股份)三种运算算法,现在要增加兼职人员(时新)的算法,但按照咱的思路写法,公司就必须把包含原三种算法的运算类给我们,让我们修改,咱小算盘一打、嘿嘿、“TMD,公司给我的工资水平那么低,我真是郁闷,这下有机会了”,于是你除了增加了兼职算法以外,在技术人员(月薪)算法中加上一句:
if(员工是我)
{
salary=salary*1.1;
}
这就意味着,咱的月薪每月会增加10%、哈哈、你爽了、但公司是不是也很爽呢,所以这样的做法就是原来运行良好的功能代码产生了变化,这样造成了很大的风险。
所以咱们要做的在增加新的算法的同时,修改其中一个不影响另外的几个,增加运算算法也不影响其他代码,这才是最成功的设计方法,好、至此咱就应用到设计模式的其他几种特性。
首先抽象出一个运算类,他有两个number属性,主要用于计算前后数,然后有一个虚方法(getresult),用于的到结果,然后我把加减乘除的写成了运算类的子类,继承他后,重写getresult()方法,这样要修改任何一个算法,就不需要提供其他算法代码。
代码如下:
那我们该怎么去应用咱们区分好的这个类呢?
我们添加一个工厂类用以初始化我们所需要的类、这里根据初始化该类的时候判断输入的字符进行相应类的实例化。
我们在客户端应用的时候直接输入相应的操作符:
这个样子,在客户端的只需要输入运算符号,工厂类就实例化出合适的对象,,通过工厂类中switch的判断形成不同的实例,这在设计模式中有一重要的特性显示出来:多态性、通过父类的方式实现了计算器的结果。而算法的实现是通过重写父类中的get_result算法呢实现,在这期间有用到了设计模式的另一个重要的特性:继承性。这样的程序不管你是控制台程序、windows程序、web程序、PDA程序或者手机程序,都可以用这段代码来实现计算器的功能,复用性~~~!如果我们有一天要改动加法运算,我们只需要改动加法类即可(operation_add)。相应的要增加各种复杂的运算,比如平方根、立方根、自然对数、正弦函数只需要增加相应的运算子类即可,但是在增加子类算法的同时我们需要改动switch中增加分支、这违反了设计模式中的“开放——封闭原则”
我们该这样做呢?
然而这一篇日志我们已经在一个简单的功能中实现了设计模式中一个比较基础的设计模式方法:简单工厂方法模式。