面向对象设计原

面向对象设计原

ID:34418526

大小:112.20 KB

页数:15页

时间:2019-03-06

面向对象设计原_第1页
面向对象设计原_第2页
面向对象设计原_第3页
面向对象设计原_第4页
面向对象设计原_第5页
资源描述:

《面向对象设计原》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、面向对象设计六大原则面向对象设计的原则是面向对象思想的提炼,它比面向对象思想的核心要素更具可操作性,但与设计模式相比,却又更加的抽象,是设计精神要义的抽象概括。形象地将,面向对象思想像法理的精神,设计原则则相对于基本宪法,而设计模式就好比各式各样的具体法律条文了。面向对象设计原则有6个:开放封闭原则,单一职责原则,依赖倒置原则,Liskov替换原则,迪米特法则和合成/聚合复用原则。单一职责原则(SingleResponsibilityPrincipleSRP)Thereshouldneverbemorethanonereaso

2、nforaclasstochange.什么意思呢?所谓单一职责原则就是一个类只负责一个职责,只有一个引起变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化会削弱或抑制这个类完成其他职责的能力,这个耦合会导致脆弱的设计。软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离;如果能够想到多于一个动机去改变一个类,那么这个类就具有多于一个职责,就应该考虑类的分离。以调制解调器为例如下图:从上述类图里面我们发现有四个方法Dial(拨通电话),Hangup(挂电话),Receive(收到信息),Se

3、nd(发送信息),经过分析不难判断出,实际上Dial(拨通电话)和Hangup(挂电话)是属于连接的范畴,而Receive(收到信息)和Send(发送信息)是属于数据传送的范畴。这里类包括两个职责,显然违反了SRP。这样做有潜在的隐患,如果要改变连接的方式,势必要修改Modem,而修改Modem类的结果导致凡事依赖Modem类可能都需要修改,这样就需要重新编译和部署,不管数据传输这部分是否需要修改。因此要重构Modem类,从中抽象出两个接口,一个专门负责连接,另一个专门负责数据传送。依赖Modem类的元素要做相应的细化,根据职

4、责的不同分别依赖不同的接口。如下图:这样以来,无论单独修改连接部分还是单独修改数据传送部分,都彼此互不影响。总结单一职责优点:降低类的复杂性,提高可维护性提高可读性。降低需求变化带来的风险。需求变化是不可避免的,如果单一职责做的好,一个接口修改只对相应的实现类有影响,对其它的接口无影响,这对系统的扩展性和维护性都有很大的帮助。开放封闭原则(Open-ClosedPrincipleOCP)Softwareentities(classes,modules,functionsetc)shouldopenforextension,bu

5、tcloseformodification.什么意思呢?所谓开放封闭原则就是软件实体应该对扩展开发,而对修改封闭。开放封闭原则是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化,降低耦合,而开放封闭原则正是对这一目标的最直接体现。开放封闭原则主要体现在两个方面:对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。为什么要用到开放封闭原则呢?软件需求总是变化的,世界上没有一个软件的是不变的,因此对软件设计人员来说,必须

6、在不需要对原有系统进行修改的情况下,实现灵活的系统扩展。如何做到对扩展开放,对修改封闭呢?实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。对于违反这一原则的类,必须通过重构来进行改善。常用于实现的设计模式主要有TemplateMethod模式和Strategy模式。而封装变化,是实现这一原则的重要手段,将经常变化的状态封装为一个类。以

7、银行业务员为例没有实现OCP的设计:publicclassBankProcess{//存款publicvoidDeposite(){}//取款publicvoidWithdraw(){}//转账publicvoidTransfer(){}}publicclassBankStaff{privateBankProcessbankpro=newBankProcess();publicvoidBankHandle(Clientclient){switch(client.Type){//存款case"deposite":bankpro.

8、Deposite();break;//取款case"withdraw":bankpro.Withdraw();break;//转账case"transfer":bankpro.Transfer();break;}}}这种设计显然是存在问题的,目前设计中就只有存款,取款和转账三

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。