Java设计模式——模式与软件设计

一、模式是什么

        人们在自己的环境中不断发现问题和寻找问题的解决方案的时候,发现有一些问题及其解决方案不断变化面孔重复出现,但在这些不同的面孔后面有着共同的本质,这些共同的本质就是模式。模式化的过程是把问题抽象化,在忽略掉不重要的细节后,发现问题的一般性本质,并找到普遍适用的解决问题的过程。

二、软件的可维护性和可复用性

1.二者的关系

通常认为,一个易于维护的系统,就是复用率较高的系统;而一个复用性较好的系统,就是一个易于维护的系统。但实际上,可维护性和可复用性是两个独立的目标,并不总是方向一致的。对于面向对象的软件系统设计来说,在支持可维护性(Maintainability)的同时,提供系统的可复用性(Reuseability)是一个核心问题。

设计原则是在提高一个系统的可维护性的同时,提高这个系统的可复用性的指导原则,依照这些设计原则进行系统设计,就可以同时做到软件的可维护性和可复用性。

2.软件系统的可维护性

软件的维护就是软件的再生。一个好的软件设计,必须能够允许新的设计要求以较为容易和平稳的方式加入到自己的系统中去。一个可维护性较好的系统,应当能够允许维护工作能够以容易、准确、安全和经济的形式进行。

导致一个软件设计的可维护性较低,也就是说会随着性能要求的变化而“腐烂”的真正原因有四个:过于僵硬(Rigidity),过于脆弱(Fragility),复用率低(Immobility),黏度过高(Viscosity)。

过于僵硬

很难再一个软件系统中加入一个新的性能,哪怕是一个很小的都很难。这是因为加入一个新性能,不仅仅意味着建造一个独立的新模块,而且因为这个新性能会波及很多其他模块,最后变成跨越几个模块的改动。

过于脆弱

软件系统在修改已有代码时过于脆弱。对一个地方的修改,往往会导致看上去没有关系的另一个地方发生故障。

复用率低

所谓复用,是指一个软件的组成部分,可以再同一个项目的不同地方甚至另一个项目中重复使用。每当程序员发现一段代码、函数、模块所做的事情可以在新的模块、或新系统中使用的时候,他们总是发现,这些已有的代码依赖于一大堆其他的东西,以至于很难将它们分开。最后,他们发现最好的办法就是不去“碰”这些已有的东西,而是重新写自己的代码。

黏度过高

有的时候,一个改动可以以保存原始设计意图和原始设计框架的方式进行,也可以以破坏原始意图和原始框架的方式进行。第一种办法无疑会对系统的未来有利,第二种办法无疑是权宜之计,可以解决短期问题,但是会牺牲中长期的利益。

一个系统设计,如果总是使得第二种办法比第一种办法容易,就叫做黏度过高。

3.系统的可复用性

(1)复用的重要性

软件复用的好处有:第一,较高的生产效率;第二,较高的软件质量;第三,恰当的使用复用可以改善系统的可维护性。

(2)面向对象设计的复用

在像Java这样面向对象的语言中,数据的抽象化、继承、封装和多态性是几项最重要的语言特性,这些特性可以使得一个系统可以在更高的层次上提供可复用性。

数据的抽象化和继承关系使得概念和定义可以复用。

多态性使得实现和应用可以复用。

抽象化和封装可以保持和促进系统的可维护性。

这样一来,复用的焦点不再集中在函数和算法等具体实现细节上,而是集中在最重要的含有宏观商业逻辑的抽象层次上。抽象层次是在提高复用性的同时保持和提供可维护性的关键。抽象层次应当是较为稳定的,是复用的重点。如果抽象层次的模块相对地独立于具体层次的模块的话,那么具体层次内部的变化就不会影响到抽象层次的结构,所以抽象层次的模块复用就会较为容易。

在面向对象的设计里面,可维护性复用是以设计原则和设计模式为基础的。

(3)对可维护性的支持

三个设计目标:可扩展性(Extensibility),灵活性(Flexibility)、可插入性(Pluggability)。

可扩展性:新的性能可以很容易的加入到系统中去。

恰当地提高系统的可复用性,可以提高系统的扩展性。允许一个具有同样接口的新的类代替旧有的类,是对接口的复用。客户端依赖于一个抽象的接口,而不是一个具体的实现类,使得这个具体类可以被另一个具体类所取代,而不影响到客户端。

系统的可扩展性是由“开-闭”原则里氏代换原则依赖倒转原则组合/聚合复用原则所保证的。

 

灵活性:可以允许代码修改平稳的发生,而不会波及到很多其他的模块。

恰当地提高系统的可复用性,可以提高系统的灵活性。在一个设计得当的系统中,每一个模块都相对于其他模块独立存在,并保持与其他模块尽可能少的通信。这样一来,在其中一个模块发生代码修改的时候,这个修改的压力不会传递到其他的模块。

系统的灵活性是由“开-闭”原则迪米特法则接口隔离原则所保证的。

 

可插入性:可以很容易的将一个类抽出去,同时将另一个有同样接口的类插入进来。

恰当地提高系统的可复用性,可以提高系统的可插入性。在一个符合“开-闭”原则的系统中,抽象层封装了与商业逻辑有关的重要行为,这些行为的具体实现由实现层给出。当一个实现类不再满足需要,需要以另一个实现类取代的时候,系统的设计可以保证旧的类被“拔出”,新的类被“插入”。

系统的可插入性是由“开-闭”原则里氏代换原则组合/聚合复用原则以及依赖倒转原则所保证。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值