试析设计模式在网络规划软件中的应用

时间:2022-10-02 09:21:05

试析设计模式在网络规划软件中的应用

1面向对象设计

设计在分析基础上进行,以分析模型作为输入,根据模型实现的要求对分析模型作必要修改和调整,或补充某些细节,就生成了设计模型的主要部分[6]。面向对象设计的基本原则是“继承”和“行为封装”,单独使用这两条原则可以建立看似正确的类,但还不能建立类之间的良好关系,设计模式针对特定问题给出了成熟且有效的类关系。面向对象的设计结合设计模式的使用可以创建更加灵活、完整和易维护的软件模型。本文针对设计中面临的具体设计问题分析设计模式的使用。

2设计模式

Gamma,Helm,Johnson和Vlissides在文献[7]中总结了23种设计模式,包括设计中经常使用的适配器、外观、和抽象工厂等模式,是针对不同的软件设计问题分别提出的解决方案。文献[8]按照设计模式目的将设计模式归纳为5类:接口型、职责型、构造型、操作型和扩展型。接口型模式关注于类之间的交互,根据交互的上下文环境决定是否需要定义或者重新定义对类方法的访问手段,可以是一个类的方法也可以是一组类的方法。接口型模式包括适配器、外观、合成和桥接4种模式。职责型模式提供了对对象职责进行分配的方法,使类中的方法既执行了相关的职责,又通过合理的访问控制进行了职责限制。职责型模式包括单件、观察者、中介者、、职责链和享元6种模式。构造型模式使对象用户不必调用构造函数即可构造新对象。构造型模式包括生成器、工厂方法、抽象工厂、原型和备忘录模式。操作型模式将一个操作分配到多个类中,依赖面向对象的多态特性,在进行方法调用时,实际执行方法取决于接收该调用对象所属的类。操作型模式包括模板方法、状态、策略、命令和解释器5种模式。扩展型模式是为程序扩展过程提供的设计模式,通过使用这些模式使得程序的扩展清晰和简单。扩展型模式包括装饰、迭代器和访问者3种模式。

3设计中的问题

按照图1的网络规划模型,用面向对象的设计方法可以抽象出3个类:Vehicle,Router和Link,分别作为成员车辆、网络层设备和链路层设备的抽象类。如使用传统的面向对象思想中的继承思想,则可直观地从此3类中为每种特定的车辆、网络层设备和链路层设备派生特定的子类。运用该软件设计方法,会遇到以下2个典型问题:问题1具备了一个完整的通信设备列表后,根据不同车辆承担的任务可以从设备列表中选择安装不同种类的网络层和链路层设备,且设备数量及连接关系也会有所区别,这样就可能演化出多种车辆类的派生类。如为每种情况创建一个派生类,则会造成车辆的派生类过多,而且每新增一种情况就得新增一个类,不便于软件扩展。问题2以链路层设备中的甚高频电台为例,不同电台的工作参数有差别,导致派生出多个甚高频电台类,它们的多数属性和方法一致,致使相同的代码要在多个类中维护,软件的可维护性较差。针对这2个典型问题,可考虑选择构造型模式中的生成器模式和接口型模式中的桥接模式,解决网络规划软件设计中的可扩展性和易维护性问题。

4生成器模式

生成器模式是将一个复杂对象的构造与其表示分离,使得同样的构造可以创建不同的表示[1]。生成器模式把构造对象实例的逻辑移到类的外部,在类的外部定义类的构造逻辑。一般使用该设计模式来解决以下2类问题:1)类包含了大量方法,需降低类的规模;2)需逐步构造一个对象,因为只能逐步获取构造函数的参数。在网络规划软件中,车辆是车内网络设备和链路设备的集合。不同类型车辆的网络设备类型不同,链路设备类型、数量及其与网络设备的接口连接关系也不同,如在软件开发时为每类车辆建立一个类,则车辆类会很多,且当车辆类型扩充或车内设备调整时需修改软件,故软件的适应性和扩展性较差。为了解决该问题,在设计时提取车内设备的种类、数量和连接关系作为车辆类的构造参数,规划过程中为网络成员分配车辆类型时,通过加载对应车型的配置信息来生成车辆的构造参数,并创建车辆实例。因此,车内设备发生变化时只需修改车型配置参数,增加新车辆类型时只需增加车型配置即可满足使用要求。车型配置在车型描述文件中描述,需包含车内的设备类型、数量及连接关系,其简单示例如下:网络规划方案的新建规划类通过成员函数添加车辆来添加网络成员,在添加车辆函数中使用构造器创建一个车辆类,并将创建成功的车辆类实例加入到车辆列表中供后续操作使用。新建规划类的成员函数加载车辆配置是来解析车辆的配置参数,并将解析的配置参数存放至构造器车辆生成器中。由此,对车辆配置进行规范的描述,从配置参数中提取车辆的构造参数并最终实例化一个车辆对象,避免为每个车辆类型创建一个车辆派生类。

5桥接模式

桥接模式通过将抽象类中的抽象操作集合移入到一个接口中创建一个桥(Bridge),从而使该抽象类由此接口的具体实现[2]最终确定实现的功能。抽象类指包含一些抽象操作的类,这些抽象操作可以有多个实现。使用桥接模式的目的是把一个抽象类与其抽象操作的实现分离,故抽象类与其抽象操作的实现可以独立更改。问题2中使用继承的方法为链路层设备创建类如图3和图4所示。使用继承的方法从无线信道设备类中按照信道类型派生了甚高频信道设备类和超高频信道设备类,又进一步分别派生出需要分配时隙的甚高频信道设备类和超高频信道设备类。该设计方法虽然遵循了封闭-开放原则,但违背了类的单一职责原则,即一个类只包含一个引起它变化的因素,这里引起变化的因素有信道类型和时隙分配方法;如果甚高频信道该设备类和超高频信道设备类的时隙分配方法类似,该方法还会产生很多重复代码;该设计方法易导致类结构过于复杂,继承关系多,难于维护和扩展。可以通过创建一个桥来解决上述设计问题,将时隙分配移动到一个抽象接口中,如图5所示,时隙分配1类和时隙分配2类是由时隙接口派生出的具体时隙实现接口。时隙维度上的变化从原来混合的派生关系中独立出来,无线信道设备类在信道类型和时隙分配方法两个维度上可以独立变化,而不会引起类结构的迅速扩大。同时,时隙分配的算法也可以在多个信道类中共用,方便了代码维护。

6结束语

本文通过两个设计案例描述了如何使用设计模式提供的解决方案优化软件设计,从而保证网络规划软件代码结构稳定、可扩展和可维护。这两个案例诠释了设计模式中体现的一些面向对象设计的基本原则,如面向对象设计的优势不在于继承,而是行为封装;类的单一职责原则,即一个类只包含一个引起它变化的因素等。由此可鉴,将设计模式思想运用到面向对象设计中时,能够创建更加灵活、完整和易于维护的软件。

作者:凌云 余亮 何平 单位:中国电子科技集团公司第二十八研究所 中兴通讯股份有限公司

上一篇:高校会计档案管制探索 下一篇:会计管理基础论释解