敏捷软件开发第五讲开闭原则与里氏替换原则

上传人:宝路 文档编号:47589393 上传时间:2018-07-03 格式:PPT 页数:34 大小:2.11MB
返回 下载 相关 举报
敏捷软件开发第五讲开闭原则与里氏替换原则_第1页
第1页 / 共34页
敏捷软件开发第五讲开闭原则与里氏替换原则_第2页
第2页 / 共34页
敏捷软件开发第五讲开闭原则与里氏替换原则_第3页
第3页 / 共34页
敏捷软件开发第五讲开闭原则与里氏替换原则_第4页
第4页 / 共34页
敏捷软件开发第五讲开闭原则与里氏替换原则_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《敏捷软件开发第五讲开闭原则与里氏替换原则》由会员分享,可在线阅读,更多相关《敏捷软件开发第五讲开闭原则与里氏替换原则(34页珍藏版)》请在金锄头文库上搜索。

1、广州大学华软软件学院软件工程系主讲教师:谭翔纬 答疑时间:周三 10:30-12:00周四 9:00-12:00 Tel:660028 Email:第五讲:开闭原则与里氏 替换原则目录n开放封闭原则(OCP)nOCP编程实例nOCP原则实施要点nLiskov替换原则nLiskov原则实施要点n总结开放封闭原则(OCP)什么是软件开发过程中最不稳定的因素?答案是需求!需求在软件开发过程中时时刻刻都可能发生变化。那么,如何灵活应对变化是软件结构设计中最重要也是最困难的一个问题。好的设计带来了极大了灵活性,不好的设计则充斥着僵化的臭味。所以我们要遵循开放封闭原则OCP。开放封闭原则(OCP)Bert

2、rand Meyer,面向对象技术大师,发明了Eiffel 语言 和按契约设计(Design by Contract)的思想,名著面向 对象软件构造的作者,法国工程院院士。目前,他除了担 任Eiffel环境和工具开发公司ISE的CTO之外,还是爱因斯坦 的母校苏黎世联邦工学院计算机科学系教授,担任软件工程 项目主席,同时还在澳大利亚Monash大学任教。他于1988 年提出了著名的开放封闭原则(OCP)。开放封闭原则的现实意义开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合。而开放封闭原则正是对这一目标的

3、最直接体现。其他的设计原则,很多时候是为实现这一目标服务的,例如后面将介绍的Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。OCP核心的思想是:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。OCP特征软件实体(类、模块、函数等)应该是可扩展的 ,但是不可修改的。OCP有两大特征:l对于扩展是开放的(Open for extension)模块的行为可以扩展,当应用的需求改变时,可以对模块进 行扩展,以满足新的需求。l对于更改是封闭的(Closed for modification)对模块行为扩展时,不必改动模块的源代码或二进制代码。

4、OCP的关键在于抽象lOCP的关键在于抽象p抽象技术:abstract class, Interfacep抽象预见了可能的所有扩展(闭)p由抽象可以随时导出新的类(开)范例:手与门l如何在程序中模拟用手去开门和关门?l行为:p开门(open)p关门(close)p判断门的状态(isOpened)设计实现public class Door public class Door private boolean _isOpen=false; private boolean _isOpen=false;public boolean isOpen() public boolean isOpen()retu

5、rn _isOpen; return _isOpen; public void open() public void open()_isOpen = true; _isOpen = true; public void close() public void close()_isOpen = false; _isOpen = false; public class Hand public class Hand public Door door;public Door door;void do() void do() if (door.isOpen() if (door.isOpen()door.

6、close(); door.close();else elsedoor.open(); door.open(); public class SmartTest public class SmartTest public static void main(String args) public static void main(String args) Hand myHand = new Hand(); Hand myHand = new Hand();myHand.door = new Door(); myHand.door = new Door();myHand.do(); myHand.d

7、o(); 新的需求需要手去开关抽屉,冰箱需要手去开关抽屉,冰箱? ?我们只好去修改程序我们只好去修改程序! !解决新的需求:修改设计public class Hand public class Hand public Door door; public Door door;public Drawer drawer; public Drawer drawer;void do(int item)void do(int item) switch (item) switch (item)case 1: case 1:if (door.isOpen() if (door.isOpen()door.clo

8、se(); door.close();else door.open(); else door.open();break; break; case 2:case 2:if (drawer.isOpen() if (drawer.isOpen()drawer.close(); drawer.close();else drawer.open(); else drawer.open();break; break; public class SmartTest public class SmartTest public static void main(String args) public stati

9、c void main(String args) Hand myHand = new Hand(); Hand myHand = new Hand();myHand.door = new Door(); myHand.door = new Door();myHand.do(1);myHand.do(1); 手被改了!手被改了! 主(使用手)程序也被改了!主(使用手)程序也被改了!符合OCP的设计方案public interface Excutablepublic interface Excutable public boolean public boolean isOpen();isOpen(

10、);public void open(); public void open();public void close(); public void close(); 新的实现public public class Doorclass Door implements Excutableimplements Excutable private boolean _isOpen = false; private boolean _isOpen = false;public boolean isOpen() public boolean isOpen() return _isOpen; return _

11、isOpen; public void open() public void open() _isOpen = true; _isOpen = true; public void close() public void close() _isOpen = false; _isOpen = false; public public class Handclass Hand public Excutable item; public Excutable item;void do()void do() if (item.isOpen() if (item.isOpen()item.close();

12、item.close();else elseitem.open(); item.open(); public public class Drawerclass Drawer implements Excutableimplements Excutable private boolean _isOpen = false; private boolean _isOpen = false;public boolean isOpen() public boolean isOpen() return _isOpen; return _isOpen; public void open() public v

13、oid open() _isOpen = true; _isOpen = true; public void close() public void close() _isOpen = false; _isOpen = false; public class SmartTest public class SmartTest public static void main(String args) public static void main(String args) Hand myHand = new Hand(); Hand myHand = new Hand();myHand.item

14、= new Door(); myHand.item = new Door();myHand.do();myHand.do(); 新的需求需要手去开关冰箱需要手去开关冰箱? ? 为冰箱实现为冰箱实现ExcutableExcutable接口接口 不需要修改任何原有的设计和代不需要修改任何原有的设计和代 码码public public class Refrigeratorclass Refrigerator implements Excutableimplements Excutable private boolean _isOpen = false; private boolean _isOpen = false;public boolean isOpen() public boolean isOpen() return _isOpen; return _isOpen; public void open() p

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号