由于作者是Java语言的追随者,所以本文的设计模式实现用的是Java语言,不过正如书中前辈所述,面向对象的语言实质上大同小异,所以将实现换为其他面向对象语言(c#、c++)也不难。由于作者水平有限,望读者海涵。
番外篇:命名遵循【见名知意】,当我们刚开始学习时,由于用的 类,变量,方法等数量都比较少,所以常常会很随意就命名,例如 public class A{},public int B = 0;,public void C(){},这些暂时看起来并不影响代码编译,功能实现也很OK,但其实是有问题的,因为这不能做到一个很基本的准则:见名知意,开发规范里,这一条是最最基本的了。这里多说几句,既然大家都用的是英文环境代码,就尽量使用英文命名,汉语拼音式命名只是部分人看懂(如果是外资项目,老外看到了其实和A,B,C命名并没区别),所以掌握基本的开发的英文词汇(为什么说是基本,因为英语也是多词一意,我们要用常用的,不要用为了装那个,用一些生僻词汇)也是必备技能。
正文篇:面向对象思想实现:
业务封装:让业务逻辑与界面逻辑分开,让他们的耦合度下降,达到易于维护和扩展的目的。
本文套用书中设计计算器的方式来实现。
1、定义变量起始类:
package operation; import lombok.Getter; import lombok.Setter; /** * Created by Administrator on 2017/8/1. */ /** * 这里利用 lombok 插件产生 get、set 方法,作用是减少手动生成get、set 方法, * 关于 lombok 插件的使用,请自己手动查阅相关资料 */ @Getter @Setter public abstract class Operation { private double numberA; private double numberB; public abstract double getResult(); }
2、 分别定义加减乘除四个类:
加法类:
package entity; import operation.Operation; /** * Created by Administrator on 2017/8/1. */ public class OperationAdd extends Operation { @Override public double getResult() { double result; result = super.getNumberA() + super.getNumberB(); return result; } }
减法类:
package entity; import operation.Operation; /** * Created by Administrator on 2017/8/1. */ public class OperationSub extends Operation { @Override public double getResult() { double result; result = super.getNumberA() - super.getNumberB(); return result; } }
乘法类:
package entity; import operation.Operation; /** * Created by Administrator on 2017/8/1. */ public class OperationMul extends Operation { @Override public double getResult() { double result; result = super.getNumberA() * super.getNumberB(); return result; } }
除法类:
package entity; import operation.Operation; /** * Created by Administrator on 2017/8/1. */ public class OperationDiv extends Operation { @Override public double getResult() { double result =0; if (0 != super.getNumberB()) { result = super.getNumberA() / super.getNumberB(); }else { throw new ArithmeticException("除数不能为 0"); } return result; } }
3、定义运算操作类:
package controller; import entity.OperationAdd; import entity.OperationDiv; import entity.OperationMul; import entity.OperationSub; import operation.Operation; /** * Created by Administrator on 2017/8/1. */ public class OperationFactory{ public static Operation createOperate(char operate){ Operation operation = null; switch (operate){ case '+': operation = new OperationAdd(); break; case '-': operation = new OperationSub(); break; case '*': operation = new OperationMul(); break; case '/': operation = new OperationDiv(); break; } return operation; } }
4、定义测试类:
import controller.OperationFactory; import operation.Operation; import org.junit.Test; /** * Created by Administrator on 2017/8/1. */ public class TestOperation { @Test public void testOperation(){ Operation operation ; operation = OperationFactory.createOperate('+'); operation.setNumberA(5); operation.setNumberB(3); double result = operation.getResult(); System.out.println(result); } }
这样如果我们想要增加相应的功能,比如开方,求对数,正余弦之类的时候,只要在entity包下增加相应的实体类,然后在操作类中switch...case增加相应的分支配置就OK。这样就达到了增减功能不影响其他功能的效果。好了,简单工厂模式到此结束。