Java设计模式-软件设计原则-UML

本文介绍了软件设计中的重要原则,包括开闭原则、好莱坞原则、依赖倒置原则和迪米特法则,强调了设计模式在软件设计中的作用。文章详细阐述了设计模式的定义、适用场景和解决方案,并探讨了UML类图在描述类关系中的应用,如继承、实现、依赖、关联、组合和聚合等。此外,文章还讨论了合成复用原则,提倡使用组合而非继承以提高系统的灵活性和可扩展性。
摘要由CSDN通过智能技术生成


在面向对象过程中,我们通常提到这样的关键词:“封装”、“继承”、“多态”。没错这是面向对象的核心思想,但是细想为何要这样做?首先封装是为了要达到数据保护,即将类的内部结构进行隐藏,对于使用者而言不需要清楚地知道在类的内部实现,仅提供可供访问的方法,对类进行操作。继承是通过对 IS-A的具体过程,在面向对象过程中,同面相对象最大的区别在于,其需要尽量避免重复工作,以实现复用。继承则是达到复用的手段之一,通过继承子类可以继承父类的方法或某些属性,使得子类可以复用父类的方法或属性而不用重复实现,并额外地添加新的功能。多态基于继承之上,它能够允许通过使用父类的引用而在运行时动态地调用子类的方法,这样的好处在于对于父类而言其无需清楚具体的子类,当使用父类调用方法时,会动态地执行该执行的行为。

以上是面向对象的大致目标,而"设计模式"则是基于面向对象设计的更高一层的设计思路。但是需要注意的是,设计模式并不是一种语法或语言特性,而是一种基于经验的总结积累。以下引用Head First中对设计模式的定义:

A Pattern is a solution to a problem in a context.

定义给出,设计模式是在特定场景下解决某种问题的解决方案,该解决方案是通过积累而给出的建议,而不是强烈要求必须要这样做。在Head First原著中对定义的解释如下:

The context is the situation in which the pattern applies. This should be a recurring situation.

The problem refers to the goal you are trying to archieve in this context, but it refers to any constraints that occur in the context.

The solution is what you’re after: a general design that anyone can apply which resolves the goal and set of contraints.

首先"场景"是指模式的所适用的情景,这种情景在软件设计中会重复多次出现。"问题"是指在上述情景下,你需要努力达到的设计目标,目标是指解决实现过程中出现的各种约束性条件。"解决方案"则正是当你面临需要解决一个特定目标和一系列约束时任何人都可以采用的一种通用的模式。因此设计模式是为在软件设计中的某一类特定问题而提出的特定的解决方案,该解决方案是一种通用的模式,类似于在建筑中所广泛采用的某种不成文的规约。

Refactoring time is is Patterns time.

Head First中提出在重构时正是设计模式使用的时候,事实也正如此,设计模式能够尽可能地在不修改或尽少的修改原有系统地情况下,对软件系统进行重构和扩展。但是在进行设计初期,便使用设计模式,对项目的扩展和维护也有巨大帮助。

软件设计原则(Design Principle)

在软件设计过程中是为了应对变化,并且需要识别变化,分离在软件设计中的变化,变化是可以扩展的部分,而使用设计模式适应该变化则是为了能够实现可扩展。

HAS-A can be better than IS-A

Head First中对该原则进行了这样的定义:

Favor composition over inheritance.

在很多中文书籍中,我们称该原则为"合成复用原则",根据Head First的描述,"有一个"的关系比"是一个"的关系更好,并且要善于利用组合去代替继承。合成复用原则对类的依赖关系做了一个要求,即要尽可能地使用弱依赖而不是强依赖,继承是一种静态的并且依赖性极强的关系,而组合较继承具有更低的依赖性,更具有扩展性和灵活性,使用组合模式构建系统,不仅让你可以在类中封装一系列你所期望的算法,而且能够在运行时动态地改变组合的行为&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值