OOP设计思想之教学设备系统.附UML图.(一)
作者:C/S框架网  发布日期:2011/07/14 22:27:38
OOP设计思想之教学设备系统.附UML图.(一)

07年,IT经理要我给开发部的新同事培训,主要是OOP及设计思想相关。

我构思了几套方案:
其一是POS零售系统,主要介绍界面设计及简单业务逻辑.
其二是汽车模型.
其三是教学设备系统

所谓教学设备系统,其实是做demo用的一套设备,包括笔记本电脑,投影仪,录音器和投影用的幕布. 为了使讲课内容通俗易懂,我选择更接近生活和日常所见的事物,于是产生教学设备系统的概念. 由于是临时想出来的方案,在上课之前没有搜集相关备课资料,难免有点心虚,在讲第一堂课仅介绍一些概念,抽象一些模型。后来在边介绍项目的同时动手建立了一个设备雏形. 定义出一组接口及介绍为什么要定义接口,讲解了接口与接口之间的藕合关系,最后由接口派生出一组类。同事们对这个话题很感兴趣,设备就在面前,看到这些设备的连接自然就理解了类之间的互动了。

接下来的工作就是逐步实现教学设备系统。

教学设备系统运行效果图:

 


下面的内容是定义接口,类UML图
 
定义两个最原始接口IDevice和ISwitchable.
IDevice设备接口抽象一个方法CheckingSystem(),检查设备是否与其它设备建立联系.
ISwitchable具备开关电源功能的接口,SetPower方法传入参数True表示打开电源,False关闭电源。
其实可以拆分两个方法: TurnOn()和TurnOff().


 
屏幕接口,只定义一个方法Draw,在屏幕上绘制图像。


 
笔记本电脑接口,同时继承IDevice和ISwitchable,称为多重继承,接口可以多重继承,类也一样。
该接口负责向投影仪发送图片及向录像设备输出屏幕截图。组合了两个对象IRecorder,IProjector,这样电脑可以通过这两个接口(变量)实现通信. 简单地说,类与类之间的互动是通过组合与引用实现的。从这个UML图就能理解。




 
投影仪接口实现多重继承,同上。组合IScreen对象,那么投影仪可以通过IScreen对象的实例向屏幕发送图像。 Play方法:向屏幕发送图像. AcceptImage方法:接受来自笔记本电脑的输出图像。
ShowDefaultImage方法:当投影仪没有连接电脑时,屏幕上会显示投影仪的预设图像,如公司Logo.


 
录音设备接口实现多重继承,同上。
Content属性:存储录制内容.录音与录像的数据表达形式是帧,比如电影胶片.所以抽象出来录制内容用动态数组存储.
Record方法:录制来自电脑的截图及讲课人的发声。  



 

笔记本电脑的类图。
学习内容:实现接口,多重继承,类与接口之间关系.


 
投影仪类图
IProject接口派生两个类ProjectorPanasonic和ProjectorHP2500L
注意NotebookDELL类的IProjector接口,明示笔记电脑兼容任何派生自IProjector接口的类。
所以NotebookDELL类的IProjector兼容ProjectorPanasonic和ProjectorHP2500L.

从逻辑关系角度来讲,NotebookDELL类与IProjector接口有藕合关系,NotebookDELL
依赖IProjector接口,与IProjector接口派生的ProjectorPanasonic和ProjectorHP2500L类
没有直接藕合关系。这正是接口的威力所在!当ProjectorPanasonic不能工作了,可以立刻换上ProjectorHP2500L继续做demo,只需要设置NotebookDELL.Projector为ProjectorHP2500L.

使用接口的另一个好处是分离代码,解除类与类之间的依赖关系,因此你的系统不会写成天罗地网。
比如:定义一个CommonInterface的dll命名为i.dll,该模块定义一组接口.比如定义一个IProjector接口,
另外3个业务逻辑分别是a.dll, b.dll, c.dll。a模块的CProject类实现了i.dll里面的IProjector接口.
而b,c都要引用a模块的CProject类. 这样b.dll和c.dll与a.dll有依赖关系(引用关系)。
但是a.dll是系统的核心模块里面有超复杂实现,开发人员不想公开a.dll其它的类。怎么办?
很简单:b和c引用i.dll就行了, 因为a模块的CProject类实现了IProjector接口啊!

接口有转移代码的特异功能,我不需要你的类,但我需要你的接口.

最后我们的代码写成这样: IProjector p=this.GetCurrentProjector();
                                              p.MakeSchedule();

这样解除了b,c与a的藕合关系,b,c也看不到a模块内任何内容。

打心底佩服那些悟出来用接口抽象事物的天才们!!!!

有了接口程序才更有活力啊!



 

录音/录像设备,参考IRecorder描述。


 

幕布(投影用,有时我们直接投影在墙上,不过效果差点)
参考IScreen定义




C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务


上一篇 下一篇