




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象设计原则面向对象设计原则n类设计n包设计面向对象设计原则类设计 nSRP,单一职责原则,一个类应该有且只有一个改变的理由 nOCP,开放封闭原则,你应该能够不用修改原有类就能扩展一个类的行为nLSP,Liskov替换原则,派生类要与其基类自相容nDIP,依赖倒置原则,依赖于抽象而不是实现nISP,接口隔离原则,客户只要关注它们所需的接口nCARP,合成/聚合复用原则,尽量使用合成/聚合、尽量不要使用继承nLoD,迪米特法则,不要和陌生人说话单一职责原则(Single-Responsibility Principle )n就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因 n所
2、谓职责n可以理解为功能,就是设计的这个类功能应该只有一个,而不是两个或更多n也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑拆分这个类了单一职责原则(Single-Responsibility Principle )n例子ninterface Modem public void dial(string pno); public void hangup(); public void send(char c); public void recv(); 单一职责原则(Single-Responsibility Principle )n例子ninterface Dat
3、aChannel public void send(char c); public void recv(); ninterface Connection public void dial(string pno); public void hangup();单一职责原则(Single-Responsibility Principle )n就像一个人身兼数职,而这些事情相互关联不大,甚至有冲突,那他就无法很好的解决这些职责,应该分到不同的人身上去做才对 n优点n消除耦合,减小因需求变化引起代码僵化性臭味 单一职责原则(Single-Responsibility Principle )n注意n一个合
4、理的类,应该仅有一个引起它变化的原因,即单一职责n 在没有变化征兆的情况下应用SRP或其他原则是不明智的n 在需求实际发生变化时就应该应用SRP等原则来重构代码开-闭原则(The Open-Closed Principle)n什么是开-闭原则一个软件实体应当对扩展开放,对修改关闭。n开-闭原则的优越性n通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求n已有的软件模块不能再被修改,这使软件系统有一定的稳定性和延续性开-闭原则的关键抽象实现Open-Closed原则,抽象化是关键。 让模块操作一个抽象的实体。由于模块依赖于一个固定的抽象实体,因此它可以是不允许被修改的;同时,通过从这
5、个抽象体的派生,也可以扩展此模块的行为对可变性的封装n考虑系统中什么可能会发生变化n一种可变性不应当散落到代码的很多角落里,而应该被封装到一个对象里n开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。 n里氏代换原则(LSP)、依赖倒转原则(DIP)、接口隔离原则(ISP)以及抽象类(Abstract Class)、接口(Interace)等等,都可以看作是开闭原则的实现方法。 里氏代换原则 (The Liskov Substitution Principle)n里氏代换原则的严格表达如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都
6、代换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。n举例对于父类和子类Base和Derived,若程序能接受Base,那么程序必然可以接受子类Derivedvoid Method (Base b); Derived d;Method (d);里氏代换原则 (The Liskov Substitution Principle)依赖倒转原则(Dependence Inversion Principle)糟糕的设计n很难添加新的功能,因为每一处改动都会影响系统中过多的模块n当你做了一处改动,却导致系统中的另一个模块发生问题n很难在别的应用程序中重用这个模块三种耦合关系n零耦合(Ni
7、l Coupling)两个类之间没有耦合关系n具体耦合(Concrete Coupling)两个具体的类之间,经由一个类对另一个具体类的直接引用造成的耦合关系n抽象耦合(Abstract Coupling)一个具体类和一个抽象类(或接口)之间的耦合关系具体耦合的例子抽象耦合的例子依赖倒转原则n高层模块不应依赖于低层模块。二者都应该依赖于抽象。n抽象不应当依赖于细节,细节应当依赖于抽象n要针对接口编程,不要针对实现编程依赖倒转原则的不足n导致大量的类出现,不容易实现n依赖倒转原则假定所有的具体类都是会变化的,这一点并不总是正确的接口隔离原则 (Interface Segregation Prin
8、ciple)n接口的污染(Interface Contamination)一些没有经验的设计师往往想节省接口的数量,将一些功能相近或功能相关的接口合并,并将这看成是代码优化的一部分。接口隔离原则n接口隔离原则(ISP)一个类对另外一个类的依赖应当是建立在最小的接口上的。换言之,使用多个专门的接口比使用单一的总接口要好。接口隔离原则例子接口隔离原则例子合成/聚合复用原则 (Composite/ Aggregate Reuse Principle)n定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的n简单表述:代码复用的时候要尽量
9、的使用合成/聚合,尽量不要使用继承复用技术继承n优点n新的实现较为容易n修改或扩展继承而来的实现较为容易n缺点n继承复用破坏封装n如果超类发生改变,那么子类的实现不得不改变n从超类继承而来的实现是静态的,不能在运行时间内发生改变复用技术合成/聚合n优点n新对象与引用对象沟通的唯一方法是被引用对象的接口,这样保持了封装性n这种复用在运行时刻动态进行n缺点n有较多的对象需要管理迪米特法则(Law of Demeter)n迪米特法则(LoD)又叫最少知识原则:n一个软件实体应当尽可能少的与其他实体发生相互作用n每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。n门
10、面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子狭义的迪米特法则n如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另外一个类的某一个方法,可以通过第三者转发这个调用。弊端n系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系这在一定程度上增加了系统的复杂度n解决办法n遵循依赖倒换原则做些折衷处理,让对象依赖于抽象层,降低耦合例子nSomeone、Friend和Stranger三个类例子nSomeone类有一个方法接受一个Friend类型的变量 npublic class Someone public
11、 void operation1( Friend friend ) Stranger stranger = vide() ; stranger.operation3() ; 例子nSomeone和Friend是朋友类(直接通讯的类)。Friend类持有一个Stranger类的私有对象,他们是朋友类:n public class Friend private Stranger stranger = new Stranger() ; public void operation2() public Stranger provide() return stranger ; 例子nS
12、omeone类和Stranger类不是朋友类,但Someone类却通过Friend类知道了Stranger类的存在,这显然违反迪米特法则。 例子n对Someone和Friend类进行重构 npublic class Friend private Stranger stranger = new Stranger() ; public void operation2() public Stranger provide() return stranger ; public void forward() stranger.operation3() ; 例子n重构Someone的operation1方法
13、,让其调用新提供的forward方法 npublic class Someone public void operation1( Friend friend ) friend.forward() ; 例子n现在Someone对Stranger的依赖完全通过Friend隔离,这样的结构已经符合狭义迪米特法则了。 n缺点:会在系统里造出大量的小方法,散落在系统的各个角落。n遵循迪米特法则会使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接关联。但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。 例子n结合依赖倒转原则,重构代码n添加一个抽象的Ab
14、stractStranger类,使Someone依赖于抽象的“AbstractStranger”角色,而不是具体实现 npublic abstract class AbstractStranger abstract void operation3() ; 例子n让Stranger从AbstractStranger类继承npublic class Stranger extends AbstractStranger public void operation3() 例子n重构Someone使其依赖抽象的AbstractStrangernpublic class Someone public voi
15、d operation1( Friend friend ) AbstractStranger stranger = vide() ; stranger.operation3() ; 例子n重构Friend的provide方法,使其返回抽象角色 npublic class Friend private Stranger stranger = new Stranger() ; public void operation2() public AbstractStranger provide() return stranger ; 例子nAbstractStranger成为Some
16、one的朋友类,而Friend类可以随时替换掉AbstractStranger的实现类,Someone不再需要了解Stranger的内部实现细节 广义迪米特法则 n将迪米特法则运用到系统的设计中时,应注意:n在类的划分上,应该创建弱耦合的类n在类的设计上,每一个类都应当尽量降低成员的访问权限n在类的设计上,只要有可能,一个类应当设计成不变类n一个对象对其它对象的引用应当降到最低n尽量降低类的访问权限n不要暴露类成员,而应该提供相应的访问器面向对象设计原则包设计nREP,重用等价原则,重用的粒度就是发布的粒度 nCCP,共同封闭原则,包中的所有类对于同一类性质的变化应该是共同封闭的 nCRP,共
17、同重用原则,一个包中的所有类应该是共同重用的 nADP,无环依赖原则,在包的依赖关系图中不允许存在环 nSDP,稳定依赖原则,朝着稳定的方向进行依赖 nSAP,稳定抽象原则,包的抽象程度应该和其稳定程度一致 n重用等价原则(REP)指的是把类放入包中时,应考虑把包作为可重用的单元。n这种设计原则和用户的使用心理有关,对于可重用的类,其开发可能比较快,开发人员会不断地推出这些可重用类的升级版本,但对于可重用类的使用者来说,不会随着可重用类的每次升级而修改自己的系统,不过,在需要升级的时候又会要求很容易地用新版本的可重用类替换旧版本的可重用类,因此设计包的一个原则是把类放在包中时要方便重用,方便对
18、这个包的各个版本的管理。 n共同闭包原则(CCP)指的是把那些需要同时改变的类放在一个包中。n例如,如果一个类的行为和/或结构的改变要求另一个类作相应的改变,则这两个类应放在一个包中;或者在删除了一个类后,另一个类变成多余的,则这两个类应放在一个包中;或者两个类之间有大量的消息发送,则这两个类也应放在一个包中。n共同闭包原则就是要提高包的内聚性、降低包与包之间的耦合度,希望在改动或升级一个包的时候要尽量少影响别的包。n共同重用原则(CRP)指的是不会一起使用的类不要放在同一包中。n这个原则和包的依赖关系有关。如果元素A依赖于包P中的某个元素,则表示A会依赖于P中的所有元素。也就是说,包P中的任何一个元素做了修改,则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 省考综合素质测试题试题及答案
- 2025集团分期付款用户单位担保合同
- 【R1快开门式压力容器操作】考试题及答案
- 天津市河西区南开翔宇中学2024-2025学年八年级下学期第二次月考英语试题(含答案无听力原文及音频)
- 2025委托合同书范文
- 《2025设备维修服务合同范本》
- 南阳农业职业学院《学前儿童教育学》2023-2024学年第二学期期末试卷
- 武汉船舶职业技术学院《医学免疫学及检验》2023-2024学年第二学期期末试卷
- 运城幼儿师范高等专科学校《数据挖掘与R语》2023-2024学年第二学期期末试卷
- 天津工程职业技术学院《药物制剂工程技术与设备》2023-2024学年第二学期期末试卷
- 计划岗位工作规划
- 《API618标准学习》课件
- 清明节的中医养生和保健方法
- 成人肥胖食养指南2024年版-国家卫健委-202403
- 新生儿头部护理课件
- 全科医学培养的病例讨论教学
- 智慧数字博物馆建设方案
- 2020年ISH国际高血压实践指南
- 《体育保健学》课件-第三章 运动性病症
- ACS患者救治总流程图
- 防爆检查五十条
评论
0/150
提交评论