java面向对象:《JAVA与模式》---面向对象设计原则

JAVA和模式---面向对象设计原则


<!--摘自CSDN->
1软件Software可维护性和可复用性

软件Software维护就是软件Software再生系统设计目标: 可扩展性灵活性可插入性

可扩展性: 新功能很容易集成到现有系统中去而不影响到系统其他模块

灵活性: 允许代码修改平稳发生当修改处时不至于影响到另这样可以缩小维护代价

可插入性: 容易用个类替换已经存在只要接口更改实现类不影响类使用者

软件Software复用可以提高软件Software生产率并且恰当复用可以提高软件Software可维护性

在以前复用主要是代码结构复用而现在复用主要针对类接口组件等等但是复用并不定会保证软件Software可维护性不能代码重复等原因就复用需要根据具体情况来分析要想通过复用来加强系统可维护性必须保证复用是支持可维护性复用

下面些设计原则可以用来指导实战

2开-闭 原则(OCP)

开闭原则是面向对象可复用基石它主要指:个软件Software实体对扩展开放对修改关闭在设计个模块时候应当是这个模块在不被修改前提下被扩展满足这个原则系统在个较高层次上实现了复用也是易于维护

那如何才能满足开闭原则呢?抽象化是关键要区分开抽象层和实现层个软件Software系统中抽象层应该是相对稳定而实现层是可以改变和扩展

开闭原则也是对可变性封装原则找到系统可变原因并将其封装起来种可变性封装为个对象那么这种可变性区别表象就是这个类具体子类

3里氏代换原则(LSP)

里氏代换原则是继承复用基石:在任何父类出现地方都可以用它子类来替代例如正方形和长方形正方形是种特殊长方形但是正方形却不能作为长方形子类因对长方形操作并不定能套用在正方形上如:resize.如果正方形作为长方形子类那么就会出现很多问题不符合里氏代换原则正方形就不能作为长方形子类应该把正方形和长方形都作为 4边形子类在实际设计类阶层体系结构时这是条很重要原则不应该作为子类不能硬套

4依赖倒转原则(DIP)

依赖倒转原则是:要依赖于抽象不要依赖于具体实现

为什么叫依赖倒转原则呢? 在传统过程性系统中高层模块依赖于低层次模块抽象层次依赖于具体层次这样导致了底层任何改变都会影响到上层这样软件Software系统没有可维护性而言

抽象层次应该不依赖于具体实现细节这样才能保证系统可复用性和可维护性这也就是所谓倒转

在实际中如何应用这原则呢?
要针对借口编程而不针对实现编程那么当实现变化时不会影响到其他地方 在java中应当使用接口和抽象类来进行变量类型声明参数类型声明思路方法返回值类型等等比如: List list = Linkedlist;

以抽象方式进行耦合是依赖倒转原则关键

依照依赖倒转原则在系统中会出现大量如抽象类和接口它假定所有具类都是有可能变化但实际上这也不总是正确些具体类是非常稳定就不需要为他发明种新类型

5 接口隔离原则(ISP)

使用多个专门借口总是比使用单总接口要好个接口应该仅代表个角色而不应该把所有操作都封装到个接口当中准确地划分角色和其所对应接口不应该把没有关系接口合并到

6合成/聚合复用原则

聚合: 表示拥有或整体和部分关系
合成:更强聚合关系整体负责部分生命周期整体和部分是不可分部分是不能被共享比如孙悟空 4肢 和他武器悟空和 4肢关系就是合成而和武器的间关系就是聚合

在面向对象中有继承和合成/聚合两种基本服用思路方法合成/聚合是将已有对象作为自己成员新对象对象已有功能这有很多优点:
1) 这种复用是黑箱操作把成员对象细节封装起来
2)这种复用可以动态改变新对象可以动态引用其他同类对象

继承复用有如下优点和缺点
1)容易实现
2)继承复用破坏了包装将超类实现细节暴露给子类
3)同时如果超类发生改变子类也不得不跟着改变
4)继承是静态

尽量使用和成/聚合而不是继承来实现复用而区分这两种关系区分”Has-A”和“Is-A”关系能正确区分两者应该就能正确使用这两种复用方式例如:人和角色通常使用继承可以把每个角色作为人子类如学生雇员经理等但是继承是静态个人具有了个角色后就不能再拥有其他角色比如个人是经理但它也是雇员也可能是学生这显然是不合理应该采用合成/聚合复用原则实际上人和角色是“Has-A”而不是”Is-a”关系并且只有当满足里氏代换原则时候才能使“Is-a”关系

在java api中 Properties 继承 HashtableProterties具有了Hashtable所有行为实际上Properties根本就不是种Hashtable.更严重是把Properties可以向上转型为Hashtable,绕过Properties接口Hashtable思路方法来对Properties操作会导致Properties内部矛盾和崩溃他们的间可以是“Has-a”,但不能是”Is-a”关系在实际中决不能代码和功能上复用而滥用继承使用继承时定要满足里氏代换原则

7迪米特法则(LoD)

迪米特法则: 个对象应当对其他对象尽可能少了解以下是些表述:

1) 只和你直接朋友通信
2) 不要和陌生人讲话
3)每个软件Software单位都对其他单位只有最少知识

其目就是降低各个单元耦合提高系统可维护性在模块的间其通信应该只通过彼此API来通信而不理会模块内部工作原理它可以使各个模块耦合程度降到最低促进软件Software复用
Tags:  面向对象设计模式 面向对象基本原则 面向对象设计原则 java面向对象

延伸阅读

最新评论

发表评论