版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计模式01,郑州大学软件学院 赵哲,主要内容,为什么要学习设计模式 设计模式准备:7大设计原则,郑州大学软件学院 赵哲,三个例子,三个例子,三个例子,设计模式解决问题,类过于庞大 类在设计时实现多复用、高内聚、低耦合 容易兼容新接口 等,七大设计原则,单一职责原则 开-闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成/聚合复用原则 迪米特原则,郑州大学软件学院 赵哲,单一职责原则,一个类只有一种职责 SRP Single Responsibility Principle prinspl 软件设计真正要做的许多内容,就是发现职责并且把职责相互分离 为什么? 高内聚、低耦合、多复用,郑州大
2、学软件学院 赵哲,一个例子,郑州大学软件学院 赵哲,思考问题,这个类中有几个职责? 用户是否登陆的方法跟用户玩游戏的方法是否有关? 获得用户信息跟其他两个职责是否有关? 如何优化代码?,郑州大学软件学院 赵哲,优化完成UML类图,郑州大学软件学院 赵哲,内聚高还是低?耦合度呢?,开-闭原则,对扩展开放、对更改封闭 Open for extension Closed for modification 开放-封闭原则是面向对象设计的核心所在 做一个例子: 写个代码片段: 完成对两个数字的加分和减法,郑州大学软件学院 赵哲,开-闭原则,大部分人的做法:,郑州大学软件学院 赵哲,若要添加乘法和除法呢?
3、,开-闭原则,郑州大学软件学院 赵哲,符合开闭原则,回顾,SRP Single Responsibility Principle,优化完成UML类图,郑州大学软件学院 赵哲,开闭原则,Open for extension Closed for modification,几个概念,封装、继承、多态 抽象类 接口 静态类 = 重载 overload 重写(覆盖)override,里氏代换原则,Barbara Liskow 在1988年发表的 1972年Barbara成为麻省理工学院的教授 是美国获得计算机科学博士学位的第一人,郑州大学软件学院 赵哲,19,里氏代换原则,Liskow Substit
4、ution Principle (LSP):子类必须能够替换掉它们的父类型 只要是基类出现的地方,一定能够出现子类! 满足里氏代换原则才可以继承,郑州大学软件学院 赵哲,20,LSP,Animal animal=new Animal(); xiaoMing.love(animal); Animal cat = new Cat(); xiaoMing.love(cat);,LSP,例子 孙悟空勾掉生死簿中所有猴子的名字,那么猕猴、石猴、长臂猿等的名字是否都勾掉了? 注意LSP反之不成立! 墨子 小取娣,美人也,爱娣,非爱美人也.盗,人也;恶盗,非恶人也,郑州大学软件学院 赵哲,22,LSP,例子
5、: 一个例子:长方形和正方形 某软件 while(长=宽),将宽+1. 父类没问题,但子类就回出现死循环 此种情况下正方形不可以继承长方形,郑州大学软件学院 赵哲,23,一个例子,郑州大学软件学院 赵哲,依赖,虚线普通箭头表示依赖 依赖和关联的区别 A和B关联,A只认识B,知道B的属性和方法,可以双关联,但不建议使用。 A依赖B B的改变影响A的结果。 通常依赖是单向的,郑州大学软件学院 赵哲,郑州大学软件学院 赵哲,如果父类的某些方法在子 类中已经发生畸变, 则建议断开父子关系!,郑州大学软件学院 赵哲,总结LSP,拒绝子类有自己的个性 一旦子类有了“个性”,则与父类之间的关系难以调和 会让
6、代码的耦合变得扑朔迷离 只要是基类出现的地方,一定能够出现子类! 满足里氏代换才允许继承,郑州大学软件学院 赵哲,依赖倒转原则,要针对接口编程,不要针对实现编程。 Program to an interface, not an implementation. 高层模块不应该依赖底层模块,两者应该都依赖抽象 High-level module should not depend upon bottom module. both should depend upon abstractions,郑州大学软件学院 赵哲,29,依赖倒转举例,开关和电灯 开关不应该依赖电灯,电灯也不应该依赖开关 两者都依
7、赖抽象,也就是各自的接口(协议) 为什么?,依赖倒转原则,减少类之间的耦合度 降低风险 一个例子 司机开车,郑州大学软件学院 赵哲,依赖倒转原则,司机还要开宝马,如何实现? 增加宝马类,但是需要修改司机类,郑州大学软件学院 赵哲,Driver,driver(Benz bz) driver(BMW bmw),如何解决,针对接口编程,郑州大学软件学院 赵哲,实现场景代码:,张三开奔驰 IDriver 张3 = new Driver(); ICar benz=new Benz(); 张3.driver(benz);,郑州大学软件学院 赵哲,练习,最初:光明农场养牛 扩展:多种牛场、喂养多种动物 最初
8、类图如下,按照依赖倒转原则画出正确类图,郑州大学软件学院 赵哲,Eat(),接口隔离原则,Interface Segregation Principle ISP 客户端不应该依赖它不需要的方法 类间的依赖关系应该建立在最小的接口上,郑州大学软件学院 赵哲,接口隔离,用电脑做什么? 写作,通讯,看电影,打游戏,上网,编程,计算,数据服务等 上网本、PC机、服务器实现不同接口 所以,我们定义接口:工作学习接口,编程开发接口,上网娱乐接口,计算和数据服务接口,这样,我们的不同功能的电脑就可以有所选择地继承这些接口。,一个例子,一个接口:内容是雇佣者有吃饭和做工作的方法 雇佣的男、女都可以使用该接口
9、有一天,雇佣者来了一个机器人。 机器人不吃饭,郑州大学软件学院 赵哲,例子 -错误,Interface IWorker void eat(); void work(); Class Worker:IWorker public void eat ()/eat 相关代码 public void work()/work相关代码 ,郑州大学软件学院 赵哲,39,ISP,例子的缺陷 胖接口,造成了对接口的污染 如何解决? 客户端不应该依赖它不需要的方法 类间的依赖关系应该建立在最小的接口上 一个接口只做一件事,郑州大学软件学院 赵哲,40,例子-符合ISP,Interface IWorkerEat vo
10、id eat(); Interface IWorkerWorkvoid work(); Class Worker:IWorkerEat,IWorkerWork public void eat ()/eat 相关代码 public void work()/work相关代码 Class Robot:IWorkerWork public void work() /work相关代码 ,郑州大学软件学院 赵哲,41,面向接口编程,而非实现编程,ISP,胖接口容易导致哑方法 瘦接口更健康!,郑州大学软件学院 赵哲,42,合成/聚合复用原则,Composite/Aggregate Reuse Princip
11、le CARP 合成和聚合 合成是强烈的关联,部分(将)和整体(主)生命周期一样,整体(主)对部分(将)有支配权,包括创建和销毁。 聚合是部分和整体的普通关联,郑州大学软件学院 赵哲,合成和聚合,刘邦和韩信,郑州大学软件学院 赵哲,44,CARP原则,合成: class Person private Hand hand; public Person() hand = new Hand(); ,郑州大学软件学院 赵哲,45,CARP原则,聚合: class Person private Computer computer; private A a; public setComputer() co
12、mputer = new Computer(); public setA() a= new a(); ,郑州大学软件学院 赵哲,46,CARP原则,尽量使用合成/聚合,而不是使用继承 继承的优点 新的实现较为容易,因为基类的大部分功能可以通过继承的关系自动进入子类。 修改和扩展继承而来的实现较为容易。 继承的缺点 继承将基类的实现细节暴露给子类。称“白箱”复用。 如果基类发生改变,那么子类的实现也不得不发生改变。 多继承不利于维护,郑州大学软件学院 赵哲,47,CARP特点,优点: 依赖少,条条框框的限制少 几乎可以用到任何环境中 容易实现 修改和扩展容易 缺点: 对象多,需要管理,郑州大学软
13、件学院 赵哲,48,迪米特原则,The Law of Demeter LoD 不要和陌生人说话 又叫最少知识原则 小国寡民,邻国相望,鸡犬之声相闻,民至老死,不相往来,郑州大学软件学院 赵哲,迪米特法则,一个对象应当对其他对象有尽可能少的了解,不和陌生人说话 最少知识、不相往来 talk only to your immediate friends,郑州大学软件学院 赵哲,50,迪米特法则的优点,相当弱的类耦合 利于复用 只要有可能类就可以设计成不变类,郑州大学软件学院 赵哲,53,迪米特法则的缺点,造成大量的小方法,散落在系统的各个角落 这些方法仅仅是传递间接的调用 容易引起第一次了解系统人
14、的困惑,郑州大学软件学院 赵哲,54,迪米特法则和设计模式,Faade模式和Mediator模式都符合迪米特法则,郑州大学软件学院 赵哲,55,总结,泛化、依赖、关联、聚合、组合 泛化(继承) class A class B : A 依赖: class A public void Function(B b) class B ,郑州大学软件学院 赵哲,关联 class A B b = new B(); class B 聚合 class A B b = new B(); C c = new C(); class B class C ,郑州大学软件学院 赵哲,合成 class A Public A() B b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度EPS环保设施施工合同
- 凝血系统课件教学课件
- 2024年度婚姻心理咨询服务协议
- 2024年全球互联网金融服务协议
- 2024年废旧书籍收购协议
- 2024代理授权协议合同租房合同模板
- 洗手绢课件教学课件
- 2024年度通信网络建设与维护合同
- 2024机械使用合同
- (2024版)网络安全系统设计与实施合同
- 土地增值税清算底稿(中税协版)
- 外贸报关用发票、装箱单、合同、报关单模板
- 管理线性规划入门形考答案
- 人教版小学五年级英语上册第一、二、三单元复习Recycle教案
- 常用钢材牌号及化学成分表
- 高大墙体混凝土浇筑技术交底(非常详细)
- 建设项目全过程工程咨询管理实施规划
- 地方应用型高校新工科专业建设面临的问题与对策
- 水平定向钻施工方案
- 雷诺现象及雷诺氏病PPT课件
- 码头报批流程图
评论
0/150
提交评论