准备知识
在OO设计领域,我们知道前人总结了不少的经验,许多的经验在现代软件工程过程中已经被认为是原则来遵守。下面笔者摘抄几项下文涉及到的OO原则的定义。
OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。我的理解是,对于一个已有的软件,如果需要扩展,应当在不需修改已有代码的基础上进。
DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。我的理解是,对于不同层次的编程,高层次暴露给低层次的应当只是接口,而不是它的具体类。
LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。众所周知类(或模块)之间的通信越少,耦合度就越低,从而更有利于我们对软件的宏观管理。老子论“圣人之治”有相同的思想,《老子》云:“是以圣人之治,虚其心,实其腹,弱其志,常使民无知无欲。”,又云:“小国寡民,邻国相望,鸡犬之声相闻,民至老死,不相往来。”。佩服我们的老祖宗,N千年前就想到了西方N千年后才想到的东西,同时也佩服《java与模式》的作者阎宏,可以用中国传统哲学思想这么生动的说明这一软件设计原则。
以一个计算器功能的程序为例
Operation类,这个类为计算器所有操作的父类。
public abstract class Operation { private double numberA; private double numberB;
//抽象具体实现方法,让子类实现 public abstract double getResult(); public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) { this.numberB = numberB; } }
OperationAdd类,继承Operation类,实现加法操作
public class OperationAdd extends Operation{ /** * 加法操作 */ @Override public double getResult() { return super.getNumberA() + super.getNumberB(); } }
OperationSub类,继承Operation类,实现减法操作
public class OperationAdd extends Operation{ /** * 加法操作 */ @Override public double getResult() { return super.getNumberA() + super.getNumberB(); } }
OperationFactory类,这个类生产需要的Operation子类。
public class OperationFactory { public static Operation createOperation(char operation){ Operation oper = null; switch(operation){ case '+': oper = new OperationAdd(); break; case '-': oper = new OperationSub(); break; case '*': oper = new OperationMul(); break; case '/': oper = new OperationDiv(); break; } return oper; } }
一个简单的计算器小程序,运用到了面向对象的继承、封装、多态。这个简单工厂模式大大增加了程序的灵活性和扩展性,如果我还要添加开根操作,只需要继承Operation类实现开根操作,再在OperationFactory类中
加一个开根的判断就行了,无需修改原来的代码。