完成了“领域模型”阶段后,面向对象已经初具雏形,我们已经看到了那熟悉的“对象”了,例如“商品”、“交易”、“商品清单”等,看起来已经进入了面向对象的世界了,你是否已经摩拳擦掌,跃跃欲试,准备开始编码了呢?
且慢,“领域模型”只是万里长征的第一步,通过领域模型分析得到的类还不能指导编码,还需要经过“设计模型”这个阶段的处理,才能基本上指导编码。
前面我们提过,领域模型的对象是没有方法的,但最终的实现肯定是有方法的,因此设计模型的第一个任务就是“为对象添加方法”。
那么是否给领域模型中的对象添加完方法就算是完成了设计模型呢?没有这么简单,给领域模型中的对象添加方法只是设计模型中最简单的一部分工作,设计模型阶段第二个任务是“围绕领域对象设计出非领域对象”。
这句话看起来比较难拗口,为什么要设计出非领域对象呢?道理很简单:领域模型中的对象是静态的,要让这些静态的对象动起来,才能最终完成客户需求。因此必须添加非领域对象,让这些非领域对象来完成让领域对象动起来的事情。
例如:“商品”本身是一个领域对象,但是这个对象是谁创建、谁使用、谁管理呢?领域模型中并没有相关的对象来完成这些职责,因此需要我们设计额外的对象来完成这些职责。
经过前两步之后,看起来设计模型的对象都已经出来了,但是我们如何知道设计得好还是不好,以什么标准来判断我们的设计是否正确呢?相信基础扎实的朋友们已经想到了,这就是万人期待、万众瞩目的,大家都耳熟能详的一个东东:设计模式。设计模型第三个任务就是“应用设计模式、设计原则”。
通过应用设计模式、设计原则,又会添加一批新的对象,接口、父子类、继承、依赖等面向对象的相关概念也逐步清晰,这样就为最终的编码打下了坚实的基础。
到这里为止,“设计模型”阶段的任务基本讲述完了,下面我们看一个简单的样例,还是以POST机为例:
在“领域模型”阶段我们已经分析出了“商品”、“商品清单”、“交易”三个领域对象,我们按照前面所讲的三个步骤一步一步来看“设计模型”阶段如何做(都以“商品”对象为例)。
第一步:“为对象添加方法”
商品对象的方法有:“获取名称”、“获取条形码”、“获取价格”等(有兴趣的朋友可以自己完善),这样对象的几个方法就出来了:getName()、getBarCode()、getPrice()。
第二步:“围绕领域对象设计出非领域对象”
“商品”对象的生命周期包括:创建、修改、使用、销毁,这些任务对象本身是无法完成的,必须添加新的对象来完成,这里我们添加一个新的对象“商品管理”来完成这些任务。这样“商品管理”对象就出来了,而这个对象在用例模型和领域模型中都是没有的。
第三步:“应用设计模式、设计原则”
我们简单的应用DIP原则(可以参考我的Blog《软件设计漫谈之三:30分钟掌握面向对象类的设计原则》)就可以发现,“商品”本身应该作为一个接口,因为不同的商品之间是有很大差异,“商品”又可以分为“食品类商品”、“饮料类商品”、“服装类商品”等等。这样应用了设计原则后,在领域模型中作为对象的“商品”,在设计模型中不再是具体对象,而是接口,然后这个接口派生出“食品类商品”、“饮料类商品”、“服装类商品”等具体对象。
以上的步骤不是瀑布式的,而是迭代式的,例如:第三步识别出“饮料类商品”这个对象后,也需要为它添加方法、设计出相关的类。
实现模型
经过前面的“用例模型”、“领域模型”、“设计模型”的讲解,面向对象分析设计都完了,面向对象已经基本成型,接下来就是要具体实现了,对应的就是“实现模型”。
“实现模型”是整个技术流程中大家接触最多的阶段,只要是做开发的,基本上都是先参与这个阶段的工作。顾名思义:实现模型就是使用具体的技术来实现设计,也就是通常意义上的编码。
但要注意的是,编码不等于敲键盘,之所以称为“实现模型”,因为这里还是有设计的,只不过这个设计和具体的实现技术有关。
例如:Interface在C++中没有,而Java中就有,具体编码的时候如果要实现设计图中的interface,那么就只能分别如下实现:
1)C++:声明没有成员变量、所有成员函数都是纯虚函数的Class;
2)Java:直接声明为interface。