您好,请 登录
 
|
|
|
 

设计模式技术基础研究

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2016-02-12 21:57:54

设计模式技术基础研究
    本章将介绍设计模式的相关技术,包括设计模式的要素、分类、描述以及常用的设计原则等内容,并提出和GUI应用程序结构设计相关的模式所存在的问题。使用设计模式有助于构建可复用的软件模块,解除软件各个部分的直接藕合,使得不同的功能模块可以独立的扩展和维护。本节将重点描述设计模式的要素、分类、描述模板、使用方式以及常用的设计原则。
1.设计模式的概述
Christopher Alexande:对于设计模式概括的定义是:每一个模式描述了一个在特定环境中不断重复出现的问题[‘“]以及解决方案的核心。GOF(Erich Gamma, RichardHelm, Ralph Johnson, John Vlissides)给出了面向对象设计模式的定义:设计模式是对一些通过相互通信以解决在特定环境下的通用设计问题的对象和类的描述。
    (1)设计模式的要素
    表2-1详细描述了设计模式的要素。一个模式的名称、问题、解决方案、效果确定了一个通用设计结构的主要方面[ys}。每一个设计模式都集中于一个特定的设计问题或设计要点[[19],描述了什么时候使用模式,以及使用效果和取舍条件。
    (2)设计模式的分类
    表2-2演示了设计模式的详细分类。
    (3)设计模式的描述
为了达到设计复用,可以使用图形符号来描述设计过程中各个类和对象之间的[20}关系L格式,并记录产生一个设计的相关选择和权衡过程。GOF给出了设计模式的描述每一个模式根据表2-3所示的模板被分解成统一的信息描述结构。2.设计模式的原则Rober C. Martin指出,导致软件设计的可维护性较低的原因有四个:过于僵硬、过于脆弱、复用率低、薪度过高[[22]。传统的复用方案主要关注于实现细节,这容易使得复用常常破坏可维护性[[23]。具备一定扩展性和灵活性的设计是提高可维护性的基础[[24],为了实现这一目标,必须遵循一定的原则,这些原则正是设计模式的精髓。  
 (1)开放封闭原则
    开放封闭原则(OCP: Open-Closed Principle)是由Bertrand Meyer}2s]提出的,指一个软件实体对扩展开放,同时对修改关闭。满足“开放封闭”原则的设计可以通过扩展己有的软件系统提供新的行为[[26],增强软件系统的适应性和灵活性,同时现有的模块,尤其是抽象层的模块对修改关闭,从而兼顾软件系统的稳定性。OCP原则从另外一个角度描述,就是“封装变化”(EVP, Encapsulation of Variation Principle),表示在设计之中需要考虑可能导致重新设计的可变因素[[27],并将这个因素封装起来。OCP原则在设计模式之中的例子是策略模式(Strategy)。策略模式通过对算法实现体变化进行封装,定义出统一的接口,使得不同的算法之间可以相互替换。
    (2)里氏替换原则
    里氏代换原则(LSP: Liskov Substitution Principle)是由Barbara Liskov提出的,其严格表达是:如果对每一个类型为T1的对象of,都有类型为T2的对象02,使得以T1定义的所有程序P在所有的对象of都代换成02时,程序P的行为没有变化,那么类型TZ是类型T1的子类型[[28]。只有当基类被子类替换掉时软件的行为不发生变化[[29],基类才能真正被复用,而子类才能在基类的基础上扩展新的功能。LSP原则在设计模式之中的例子是组合模式((Composite)。组合模式使用树形结构描述整体和部分的关系,将单个对象和容器类对象一致对待。
    (3)依赖倒置原则
    依赖倒置原则(DIP: Dependence Inversion Principle)}3o]将软件中各个模块之间的依赖关系全部转移到抽象,颠覆了过程式设计之中面向实现编程的方式,转而面向接口编程。抽象表示针对应用系统业务逻辑[[31」的宏观设计,一般要相对稳定;而细节则表示与实现相关的算法和逻辑,其选择具备比较大的偶然性,容易发生变更。传统的过程式设计中高层的模块依赖于低层的模块[[32],抽象层次依赖于具体层次,DIP原则正是对这种依赖关系的倒转。DIP原则在设计模式之中的例子是工厂方法模式((Factory Method)。工厂方法模式通过定义一个创建对象的接口,将实例化的过程延迟到子类中实现。
    (4)合成复用原则
    合成复用原则(CRP: Composite Reuse Principle)又叫做合成/聚合复用原则(CARP:Composite/Aggregate Reuse Principle)}33},指要尽量使用对象组合取代继承的设计。合成(Composition)和聚合(Aggregation)均是关联(Association)的特殊种类[34]聚合表示整体和部分的弱的拥有关系,合成则表示一种强的拥有关系。继承机制之中父类和子类是强藕合的关系,而且不支持在运行时改变实现;而对象组合则支持在运行时动态绑定对象的实现,具备更大的灵活性。CRP原则在设计模式之中的例子是桥接模式((Bridge)。桥接模式将使用相互独立的类层次结构来描述彼此正交的变化点,使得抽象部分和实现部分可以独立地变化。
    (5)迪米特法则
迪米特法则(LoD: Law of Demeter)又叫做最少知识原则(LKP: Least Knowledge Principle),指一个对象应当对其他的对象有尽可能少的了解[[35]。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用;如果其中一个类需要调用另外一个类的方法,可以通过一个中间层来转发这个调用[[36]。在软件系统中,一个设计良好的模块应当将内部数据与和实现相关的细节隐藏起来[[37],将提供给外界的接口与实现体分离开来。信息隐藏有助于使各个子系统之间解藕 }3 s},方便各个模块独立地进行扩展。在类的划分之中,应当创建弱藕合的类,类之间的藕合越弱,越有利于复用[}39} o LoD法则在设计模式之中的例子是外观模式((Facade)。外观模式引入一个隔离层为子系统提供一致的界面,使得子系统更加容易使用。
3.设计模式的运用机制
    设计模式采用多种方法解决实际应用设计之中所重复出现的问题,使用这些方法有助于将一个软件分解成若干相对独立的模块,并降低这些模块的藕合性。
    (1)提炼对象
    应用程序可以分解为一系列协作的对象[[40],对象包括数据成员以及对数据进行操作的成员函数。将系统分解成对象集合[[41」是面向对象设计中最困难的部分,这涉及到包括灵活性和复用性在内的一系列因素的考虑。
    (2)规划粒度
    对象粒度是指对象所能容纳的逻辑单元[[42],粒度大小的选择对于设计的灵活性和重用性有比较大的影响。
    (3)设计接口
    在面向对象的系统中,接口是对象与外部交流的唯一途径「43],对象接口与其功能的实现是分离的,不同的对象对同一个请求可以提供完全不同的实现。
    (4)描述实现
    类定义了对象的类型以及所能执行的操作集合「44],类继承一般在基类之中定义尽可能多的公共方法[[45],同时把部分实现延迟到子类。针对接口编程,而不是针对实现编程,可以使得客户需要关注对象所包含的接口「46],降低藕合性。
    (5)复用机制
    类继承是在编译期间静态定义的[[47],子类和父类是一种紧藕合的关系;对象组合是在运行时刻通过获得其他对象的引用而动态链接到实现体,这有利于构建系统各个实现模块之间的松藕合的关系。优先使用对象组合而不是继承,有助于保持类的封装性和职责的分离[[48],保证类继承的层次控制在较小的规模。
    (6)封装变化
    系统需求会随着软件的开发和维护而不断变更[[49],设计模式通过对变化点的封装,避免重新设计。
    需要指出的是,设计模式通常会引入额外的隔离层来提高设计的灵活性和扩展性,这在部分程度上增加了设计的复杂度[[50]。模式的误用会导致过度设计,从而增加软件维护的难度。只有当模式所提供的灵活性和伸缩性远远大于所带来的开销,才有必要使用这个模式。
 

  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论