您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 软件工程概述及设计模式
.目录1OO概述4常用设计模式3OO六大原则2面向接口编程.1OO概述面向对象分析(OOA)做什么?从问题域中获取需要的类和对象,以及它们之间的关系。面向对象设计(OOD)怎么做?面向对象编程(OOP)Doit.1OO概述老张开车去东北。请用OO思想进行分析(OOA)和设计(OOD),体现OO三大特性封装类(名词):.1OO概述老张开车去东北。请用OO思想进行分析(OOA)和设计(OOD)。封装类(名词):.1OO概述老张开车去东北。封装创建成员方法。.1OO概述老张开车去东北。获取属性,完善成员方法。.1OO概述老张开车去东北。封装:作用?隐藏信息,降低类间耦合性。.1OO概述老张开车去东北。初始设计.1OO概述publicclassDriver{privateStringdriverName;publicStringgetName(){returndriverName;}publicvoiddrive(Carcar){car.go(newAddress(东北));}}.1OO概述publicclassCar{publicvoidgo(Addressdest){System.out.println(一路哼着歌,冒着烟,去了+dest.getName());}}.1OO概述publicclassAddress{privateStringaddressName;publicStringgetName(){returnaddressName;}publicvoidsetName(Stringname){addressName=name;}}.1OO概述老张开车去东北。设计优化:继承和多态在某个粒度视图层面上对同类事物不加区别的对待而统一处理.1OO概述publicclassDriver{privateStringdriverName;publicStringgetName(){returndriverName;}publicvoidsetName(Stringname){driverName=name;}//Viheclevihecle=newCar();publicvoiddrive(Viheclevihecle){vihecle.go(newAddress(东北));}}.1OO概述publicabstractclassVihecle{publicabstractvoidgo(Addressdest);}publicclassCarextendsVihecle{publicvoidgo(Addressdest){System.out.println(一路哼着歌,冒着烟,去了+dest.getName());}}publicclassPlaneextendsVihecle{publicvoidgo(Addressdest){System.out.println(“一路驾着云彩去了+dest.getName());}}.1OO概述publicclassAddress{privateStringaddressName;publicAddress(Stringname){addressName=name;}publicStringgetName(){returnaddressName;}publicvoidsetName(Stringname){addressName=name;}}.1OO概述publicclassClient{publicstaticvoidmain(String[]args){Driverd=newDriver();d.setName(老张);//d.drive(newPlane());d.drive(newCar());}}有什么缺陷?.1OO概述持续优化:添加而不修改,系统扩展性强!重载.2面向接口编程•面试题:1.抽象类可以有构造方法,接口不可以.2.抽象类中可以有普通成员变量,普通方法.接口不可以.3.抽象类中的抽象方法的访问类型不能是private访问类型,但接口的抽象方法只能是public.4.抽象类可以包含静态方法,但接口不可以.5.抽象类中静态成员变量的访问类型可以任意.但接口只能是Public(static)final类型.6.一个类可以实现多个接口,但只能继承一个抽象类.1abstractclass和interface有什么区别?.2面向接口编程设计层面:抽象类是某种抽象事物(isa)。接口是一组行为规范(likea)。接口体现了“如果你是……则必须能……”的理念语法层面:抽象类体现单继承关系;接口可实现多继承。.2面向接口编程.2面向接口编程•面试题(扩展题):2.1接口是否可以继承接口?2.2接口是否可以继承抽象类?2.3抽象类是否可以实现接口?2.4抽象类是否可以继承具体类?2.5抽象类中是否可以有静态的main方法?抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstrct方法!.2面向接口编程面向接口编程:在系统分析和架构中,分清层次和依赖关系,下层不是直接向其上层提供服务:即不是直接实例化在上层中,而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。系统层次间协作关系是系统设计的关键,小到不同类之间的通信,大到各模块之间的交互。•本质:面向抽象编程,定义与实现的分离。.2.1.1设计模式四人帮GoF(“四人帮”,又称GangofFour,即ErichGamma,RichardHelm,RalphJohnson&JohnVlissides四人)的《设计模式》,原名《DesignPatterns:ElementsofReusableObject-OrientedSoftware》,第一次将设计模式提升到理论高度,并将之规范化。该书提出了23种基本设计模式。.3.8六大原则总览.3.1单一职责原则(SRP)单一职责原则(SingleResponsibilityPrinciple)定义:应该有且仅有一个原因引起类的变更。通俗言之:一个类只负责一个职责。单一职责原则:实现高内聚、低耦合的指导方针。问题由来:类T负责两个不同的职责:职责P1,职责P2。则职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。总结:接口一定要做到单一职责,类的设计尽量做到一个原因引起变化就行。.3.2接口隔离原则(ISP)接口隔离原则(InterfaceSegregationPrinciple)定义:1、客户端不应该依赖它不需要的接口。2、类间的依赖关系应该建立在最小的接口上。通俗言之:不要建立臃肿庞大的接口。与单一原则的区别单一职责要求的是类和接口单一,注重的是职责,这是业务逻辑上的划分。而接口隔离原则要求接口的方法尽量少。.3.2接口隔离原则(ISP)Eg:设计门的类abstractDoor{abstractvoidOpen();abstractvoidClose();}.3.2接口隔离原则(ISP)新需求:需要门具有报警功能。解决方案一:在抽象类(或接口)Door添加alarm方法。abstractDoor{abstractvoidOpen();abstractvoidClose();abstractvoidAlarm();}.3.2接口隔离原则(ISP)问题?违背ISP(接口隔离原则),Alarm方法对于依赖Door的模块是多余的。修改方案:1)abstactDoor保留Open()、Close(),Alarm由子类扩展。2)拆分成interfaceDoor和interfaceAlarm接口。3)拆分成abstactDoor和interfaceAlarm。.3.2接口隔离原则(ISP)abstractDoor{abstractvoidOpen();abstractvoidClose();}InterfaceAlarmable{voidAlarm();}classAlarmDoorextendsDoorimplentsAlarmable{…}.3.3里氏替换原则(LSP)里氏替换原则(LiskovSubstitutionPrinciple)定义:所有引用基类的地方必须能透明地使用其子类的对象。通俗言之:任何父类出现的地方,子类一定可以出现。在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。总结:子类可以扩展父类的功能,但不能改变父类原有的功能.3.4依赖倒置原则(DIP)依赖倒置原则(DependenceInversionPrinciple)定义:1、高层模块不应该依赖低层模块,两者都应该依赖于抽象(抽象类或接口)。2、抽象(抽象类或接口)不应该依赖于细节(具体实现类)。3、细节(具体实现类)应该依赖抽象。通俗言之:依赖抽象,不依赖实现。总结:面向接口编程.3.5开闭原则(OCP)开闭原则(OpenClosePrinciple)定义:一个软件实体如类、模块和函数,应该对扩展开放,对修改关闭。通俗言之:一个好的系统是在不修改已有源代码的情况下,可以扩展功能。实现开闭原则的关键就是抽象化。.3.5开闭原则(OCP)在开-闭原则中,不允许修改的是抽象的类或者接口,允许扩展的是具体的实现类,抽象类和接口在开-闭原则中扮演着极其重要的角色。模板方法模式和观察者模式都是开闭原则的极好体现。.3.6合成复用原则(CRP)合成复用原则(CompositeReusePrinciple,CARP):要优先使用对象组合(聚合)通俗言之:要尽量使用合成/聚合,尽量不要使用继承。继承复用:从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;破坏封装性,把父类实现细节直接暴露给子类(白箱复用);父类发生改变,子类也应改变,类与类之间高耦合。.3.6合成复用原则(CRP)组合/聚合复用:耦合度相对较低,可以在运行时动态进行。黑箱复用!如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承。桥接模式遵循该原则!.3.6合成复用原则(CRP).3.6合成复用原则(CRP).3.7迪米特原则(LOD)迪米特原则(LawOfDemeter)定义:指一个对象应该对于其他对象有最少的了解。问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。通俗言之:不要跟陌生人说话。类应该对自己需要耦合或调用的类知道得越少越好。.2.1.2设计模式概述设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。为何提倡设计模式?根本原因是为了代码复用,增加可维护性。设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式。设计模式通过实现面向对象六大原则,从而达到了代码复用、增加可维护性的目的。.2.2.1设计模式基本元素•模式名称•问题•解决方案•效果.2.2.2设计模式分类•设计模式分为三种类型,共23类。创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。.2.3.1设计模式之单例模式(Singleton)单例设计模式的特点:1.单例设计模式保证一个类只有一个实例;2.要提供一个访问该类对象实例的全局访问点。单例模式最重要的就是要保证一个类只有一个实例并且这个类易于被访问。一个全局类使得一个对象可以被访问,但是这样做却不能防止你实例化多个对象。.2.3.1设计模式之单例模式(Singleton)单例设计模式的实现:1.为了避免其它程序过多的建立该类的对象,先禁止其它程序建立该类对象实例(将构造器私有化)。2.为了方便其它程序访问该类的对象,只好在本类中自定义一个对象,由1可知该对象是static的,并对外提供访问方式。.2.3.1设计模
本文标题:软件工程概述及设计模式
链接地址:https://www.777doc.com/doc-5994612 .html