uml第六课(精品).ppt
《uml第六课(精品).ppt》由会员分享,可在线阅读,更多相关《uml第六课(精品).ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象技术面向对象技术Object-Oriented TechniquesObject-Oriented Techniques谭火彬谭火彬82339316-806第第 6 6 章面向对象的设计原则章面向对象的设计原则Object-Oriented Design PrinciplesObject-Oriented Design PrinciplesReview:Use-Case Analysisn评估用例,确定迭代周期评估用例,确定迭代周期n在每一次迭代中的每一个用例:在每一次迭代中的每一个用例:n1.寻找候选对象寻找候选对象n获得各类对象清单:实体类、控制类、边界类获得各类对象清单:实体类、
2、控制类、边界类n2.描述对象间的交互描述对象间的交互-顺序图顺序图n针对每个事件流,通过顺序图演示用例的实现过程针对每个事件流,通过顺序图演示用例的实现过程n3.描述类描述类-类图类图n完成类图,描绘类图中的关系完成类图,描绘类图中的关系n重构类图,构造整个系统的分析模型重构类图,构造整个系统的分析模型3学习线路图学习线路图OOOOUMLUMLOOAOOPOOPDP Case-Study 学学 习习 线线 路路 图图4ReferencesnMart02,Robert C.Martin,Agile Software Development-Principles,Patterns,and Prac
3、tices(邓辉译,敏(邓辉译,敏捷软件开发捷软件开发-原则、模式与实践,清华大原则、模式与实践,清华大学出版社,学出版社,2003年)年)5从问题开始!从问题开始!n长方形与正方形长方形与正方形n假如我们有一个类:长方形(假如我们有一个类:长方形(Rectangle)n我们需要一个新的类,正方形(我们需要一个新的类,正方形(Square)n问:可否直接继承长方形?问:可否直接继承长方形?没问题,因为数学上正方形就是长方形的子类!没问题,因为数学上正方形就是长方形的子类!没问题,因为数学上正方形就是长方形的子类!没问题,因为数学上正方形就是长方形的子类!6开始设计:正方形开始设计:正方形pub
4、lic class Rectangle public class Rectangle private private intint width;width;private private intint height;height;public void public void setWidth(intsetWidth(int w)w)width=w;width=w;public public intint getWidthgetWidth()()return width;return width;public void public void setHeight(intsetHeight(in
5、t h)h)height=h;height=h;public public intint getHeightgetHeight()()return height;return height;public class Square public class Square extends Rectangle extends Rectangle public void public void setWidth(intsetWidth(int w)w)super.setWidthsuper.setWidth(w);(w);super.setHeightsuper.setHeight(w);(w);pu
6、blic void public void setHeight(intsetHeight(int h)h)super.setWidthsuper.setWidth(h);(h);super.setHeightsuper.setHeight(h);(h);7设计方案正确吗?设计方案正确吗?public static void public static void resizeresize(Rectangle(Rectangle r)r)while(while(r.getHeightr.getHeight()=()=r.getWidthr.getWidth()()r.setHeight(r.get
7、Heightr.setHeight(r.getHeight()+1);()+1);System.out.println(“ItsSystem.out.println(“Its OK.);OK.);Rectangle r1=new Rectangle r1=new Rectangle();Rectangle();r1.setHeight(5);r1.setHeight(5);r1.setWidth(15);r1.setWidth(15);resize(r1);resize(r1);Rectangle r2=new Square();Rectangle r2=new Square();r2.set
8、Height(5);r2.setHeight(5);r2.setWidth(15);r2.setWidth(15);resize(r2);resize(r2);使用父类(长方形)时,程序正常运行使用父类(长方形)时,程序正常运行使用父类(长方形)时,程序正常运行使用父类(长方形)时,程序正常运行使用子类(正方形)时,程序陷入死循环使用子类(正方形)时,程序陷入死循环使用子类(正方形)时,程序陷入死循环使用子类(正方形)时,程序陷入死循环设计出问题了?继承出问题了?设计出问题了?继承出问题了?设计出问题了?继承出问题了?设计出问题了?继承出问题了?8为什么会出现问题?为什么会出现问题?违背了面向
9、对象的设计原则!违背了面向对象的设计原则!9面向对象的设计原则面向对象的设计原则n什么是面向对象设计原则?什么是面向对象设计原则?n面向对象设计原则有什么意义?面向对象设计原则有什么意义?n是指导面向对象设计的基本指导思想是指导面向对象设计的基本指导思想n是评价面向对象设计的价值观体系是评价面向对象设计的价值观体系n是设计模式的出发点和归宿是设计模式的出发点和归宿10设计目标设计目标n设计目标设计目标n可扩展性可扩展性(Extensibility)n灵活性灵活性(Flexibility)n可插入性可插入性(Pluggability)n11设计质量:好的设计设计质量:好的设计n什么是好的设计?什
10、么是好的设计?n容易理解容易理解n容易修改和扩展容易修改和扩展n容易复用容易复用n容易实现与应用容易实现与应用n简单、紧凑、经济适用简单、紧凑、经济适用n让人工作起来心情愉快的设计让人工作起来心情愉快的设计12设计质量:坏的设计设计质量:坏的设计n什么是坏的设计?什么是坏的设计?n僵化性(僵化性(Rigidity):刚性,难以修改,牵一发而):刚性,难以修改,牵一发而动全身动全身n脆弱性(脆弱性(Fragility):易):易碎,牵一发而肝胆俱裂碎,牵一发而肝胆俱裂n牢固性(牢固性(Immobility):无法分解成可移植的组):无法分解成可移植的组件件n粘滞性(粘滞性(Viscosity),
11、修改设计代价高昂),修改设计代价高昂n不必要的复杂性(不必要的复杂性(Needless Repetition)n晦涩性(晦涩性(Opacity):不透明,很难看清设计者的):不透明,很难看清设计者的真实意图真实意图13设计质量:培养灵敏的嗅觉设计质量:培养灵敏的嗅觉n糟糕的设计总是散发出臭味,让人不悦。判断糟糕的设计总是散发出臭味,让人不悦。判断一个设计的好坏,主观上能否让你的合作方感一个设计的好坏,主观上能否让你的合作方感到心情愉悦,是最直观的标准到心情愉悦,是最直观的标准n设计开发人员要培养嗅觉,当你看到设计开发人员要培养嗅觉,当你看到UML图或图或者代码,感到杂乱、繁琐、郁闷的时候,你可
12、者代码,感到杂乱、繁琐、郁闷的时候,你可能正面对一个糟糕的设计能正面对一个糟糕的设计n这种嗅觉是在实践开发中培养起来的,而面向这种嗅觉是在实践开发中培养起来的,而面向对象设计原则对此加以归纳和总结对象设计原则对此加以归纳和总结14面向对象的基本设计原则面向对象的基本设计原则nLSP:Liskov替换原则替换原则nThe Liskov Substitution PrinciplenOCP:开放:开放-封闭原则封闭原则nThe Open-Close PrinciplenSRP:单一职责原则:单一职责原则nThe Single Responsibility PrinciplenISP:接口隔离原则:
13、接口隔离原则nThe Interface Segregation Principle nDIP:依赖倒置原则:依赖倒置原则nThe Dependency Inversion Principlen15LSPnLSP(The Liskov Substitution Principle,Liskov替换原则)替换原则)n“若对于类型若对于类型S的任一对象的任一对象o1,均有类型,均有类型T的对象的对象o2存在,使得在存在,使得在T定义的所有程序定义的所有程序P中,用中,用o1替换替换o2之之后,程序的行为不变,则后,程序的行为不变,则S是是T的子类型的子类型”n如果在任何情况下,子类(或子类型)或实
14、现类与如果在任何情况下,子类(或子类型)或实现类与基类都是可以互换的,那么继承的使用就是合适的。基类都是可以互换的,那么继承的使用就是合适的。为了达到这一目标,为了达到这一目标,子类不能添加任何父类没有的子类不能添加任何父类没有的子类不能添加任何父类没有的子类不能添加任何父类没有的附加约束附加约束附加约束附加约束n“子类对象必须可以替换基类对象子类对象必须可以替换基类对象子类对象必须可以替换基类对象子类对象必须可以替换基类对象”16违背违背LSP原则原则SquareSquare类针对类针对类针对类针对heightheight、widthwidth添加了添加了添加了添加了RectangleRec
15、tangle所没有的附加的约束(即要求所没有的附加的约束(即要求所没有的附加的约束(即要求所没有的附加的约束(即要求height=widthheight=width),这样),这样),这样),这样SquareSquare类(子类(子类(子类(子类)不能完全替换类)不能完全替换类)不能完全替换类)不能完全替换RectangleRectangle(父类)(父类)(父类)(父类)违背了违背了违背了违背了LSPLSP原则原则原则原则带来潜在的设计问题(使用带来潜在的设计问题(使用带来潜在的设计问题(使用带来潜在的设计问题(使用resizeresize方法方法方法方法时,子类出错!)时,子类出错!)时,
16、子类出错!)时,子类出错!)17怎么办?怎么办?在可能的情况下,由抽象类(接口)继承在可能的情况下,由抽象类(接口)继承在可能的情况下,由抽象类(接口)继承在可能的情况下,由抽象类(接口)继承18抽象类与具体类抽象类与具体类只要有可能,不要从具体类继承只要有可能,不要从具体类继承只要有可能,不要从具体类继承只要有可能,不要从具体类继承。行为集中的方向是向上的(抽象类)行为集中的方向是向上的(抽象类)行为集中的方向是向上的(抽象类)行为集中的方向是向上的(抽象类)数据集中的方向是向下的(具体类数据集中的方向是向下的(具体类数据集中的方向是向下的(具体类数据集中的方向是向下的(具体类)19解决方案
17、解决方案20IS-A关系的思考?关系的思考?n鸵鸟是鸟吗?是鸵鸟是鸟吗?是n鸵鸟有翅膀,鸟也有翅膀鸵鸟有翅膀,鸟也有翅膀n鸵鸟有喙,鸟也有喙鸵鸟有喙,鸟也有喙n但是但是n鸟鸟.getFlySpeed()n鸵鸟鸵鸟.getRunSpeed()n有着不同有着不同21IS-A关系的思考关系的思考(续续)n对于动物学家对于动物学家n只关心鸟的生理特征,对他们来说,鸵鸟就只关心鸟的生理特征,对他们来说,鸵鸟就是鸟是鸟n 对于养鸟人对于养鸟人n关心鸟的行为特征,鸵鸟不是鸟关心鸟的行为特征,鸵鸟不是鸟n 他们都正确他们都正确n考虑一个特定设计是否恰当时,不能完考虑一个特定设计是否恰当时,不能完全孤立地看这个
18、解决方案,应该根据设全孤立地看这个解决方案,应该根据设计的使用者提出的合理假设来审视计的使用者提出的合理假设来审视22OCPnOCP(The Open-Close Principle,开放开放-封闭原则)封闭原则)n软件实体(类、模块、函数等)应该是可扩展软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的的,但是不可修改的n特征:特征:n对于扩展是开放的(对于扩展是开放的(Open for extension)n模块的行为可以扩展,当应用的需求改变时,可以对模模块的行为可以扩展,当应用的需求改变时,可以对模块进行扩展,以满足新的需求块进行扩展,以满足新的需求n对于更改是封闭的(对于更改
19、是封闭的(Closed for modification)n对模块行为扩展时,不必改动模块的源代码或二进制代对模块行为扩展时,不必改动模块的源代码或二进制代码码23OCP的关键在于抽象的关键在于抽象nOCP的关键在于抽象的关键在于抽象n抽象技术:抽象技术:abstract class,Interfacen抽象预见了可能的所有扩展(闭)抽象预见了可能的所有扩展(闭)n由抽象可以随时导出新的类(开)由抽象可以随时导出新的类(开)24范例:手与门范例:手与门n如何在程序中模拟用手去开门和关门?如何在程序中模拟用手去开门和关门?n行为:行为:n开门(开门(open)n关门(关门(close)n判断门的
20、状态(判断门的状态(isOpened)25设计实现设计实现public class Door public class Door private private booleanboolean _ _isOpenisOpen=false;=false;public public booleanboolean isOpenisOpen()()return _ return _isOpenisOpen;public void open()public void open()_ _isOpenisOpen=true;=true;public void close()public void close(
21、)_ _isOpenisOpen=false;=false;public class Hand public class Hand public Door door;public Door door;void do()void do()if(if(door.isOpendoor.isOpen()()door.closedoor.close();();else else door.opendoor.open();();public class public class SmartTestSmartTest public static void public static void main(St
22、ringmain(String argsargs)Hand Hand myHandmyHand=new Hand();=new Hand();myHand.doormyHand.door=new Door();=new Door();myHand.domyHand.do();();26新的需求新的需求需要手去开关抽屉,冰箱需要手去开关抽屉,冰箱?我们只好去修改程序我们只好去修改程序!27解决新的需求:修改设计解决新的需求:修改设计public class Hand public class Hand public Door door;public Door door;public Drawer
23、 drawer;public Drawer drawer;void void do(intdo(int item)item)switch(item)switch(item)case 1:case 1:if(if(door.isOpendoor.isOpen()()door.closedoor.close();();else else door.opendoor.open();();break;break;case 2:case 2:if(if(drawer.isOpendrawer.isOpen()()drawer.closedrawer.close();();else else drawer
24、.opendrawer.open();();break;break;public class public class SmartTestSmartTest public static void public static void main(Stringmain(String argsargs)Hand Hand myHandmyHand=new Hand();=new Hand();myHand.doormyHand.door=new Door();=new Door();myHand.do(1);myHand.do(1);手被改了!手被改了!主(使用手)程序也被改了!主(使用手)程序也被
25、改了!28符合符合OCP的设计方案的设计方案public interface public interface ExcutableExcutable public public booleanboolean isOpenisOpen();();public void open();public void open();public void close();public void close();29新的实现新的实现public public class Doorclass Door implements implements ExcutableExcutable private privat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uml 第六 精品
限制150内