软件工程概述及设计模式

上传人:汽*** 文档编号:568663797 上传时间:2024-07-26 格式:PPT 页数:112 大小:2.67MB
返回 下载 相关 举报
软件工程概述及设计模式_第1页
第1页 / 共112页
软件工程概述及设计模式_第2页
第2页 / 共112页
软件工程概述及设计模式_第3页
第3页 / 共112页
软件工程概述及设计模式_第4页
第4页 / 共112页
软件工程概述及设计模式_第5页
第5页 / 共112页
点击查看更多>>
资源描述

《软件工程概述及设计模式》由会员分享,可在线阅读,更多相关《软件工程概述及设计模式(112页珍藏版)》请在金锄头文库上搜索。

1、目录1OO概述4常用设计模式3OO六大原则2面向接口编程1OO概述面向对象分析面向对象分析(OOA)做什么?做什么?从问题域中获取需要的类和对象,以及它们之间的关系。从问题域中获取需要的类和对象,以及它们之间的关系。面向对象设计面向对象设计(OOD)怎么做?怎么做?面向对象编程面向对象编程(OOP)Doit1OO概述老张开车去东北。老张开车去东北。请用请用OO思想进行分析思想进行分析(OOA)和设计和设计(OOD),体现体现OO三大特性三大特性封装类封装类(名词名词):1OO概述老张开车去东北。老张开车去东北。请用请用OO思想进行分析思想进行分析(OOA)和设计和设计(OOD)。封装类封装类(

2、名词名词):1OO概述老张开车去东北。老张开车去东北。封装封装创建成员方法。创建成员方法。1OO概述老张开车去东北。老张开车去东北。获取属性,完善成员方法。获取属性,完善成员方法。1OO概述老张开车去东北。老张开车去东北。封装:作用?隐藏信息,降低类间耦合性。1OO概述老张开车去东北。老张开车去东北。初始设计初始设计1OO概述publicclassDriverprivateStringdriverName;publicStringgetName()returndriverName;publicvoiddrive(Carcar)car.go(newAddress(东北);1OO概述publicc

3、lassCarpublicvoidgo(Addressdest)System.out.println(一路哼着歌,冒着烟,去了+dest.getName();1OO概述publicclassAddressprivateStringaddressName;publicStringgetName()returnaddressName;publicvoidsetName(Stringname)addressName=name;1OO概述老张开车去东北。老张开车去东北。设计优化:继承和多态设计优化:继承和多态在某个粒度视图层面上对同类事物不加区别的对待而统一处理1OO概述publicclassDriv

4、erprivateStringdriverName;publicStringgetName()returndriverName;publicvoidsetName(Stringname)driverName=name;/Viheclevihecle=newCar();publicvoiddrive(Viheclevihecle)vihecle.go(newAddress(东北);1OO概述publicabstractclassViheclepublicabstractvoidgo(Addressdest);publicclassCarextendsViheclepublicvoidgo(Add

5、ressdest)System.out.println(一路哼着歌,冒着烟,去了+dest.getName();publicclassPlaneextendsViheclepublicvoidgo(Addressdest)System.out.println(“一路驾着云彩去了+dest.getName();1OO概述publicclassAddressprivateStringaddressName;publicAddress(Stringname)addressName=name;publicStringgetName()returnaddressName;publicvoidsetNam

6、e(Stringname)addressName=name;1OO概述publicclassClientpublicstaticvoidmain(Stringargs)Driverd=newDriver();d.setName(老张);/d.drive(newPlane();d.drive(newCar();有什么缺陷?1OO概述持续优化:添加而不修改,系统扩展性强!持续优化:添加而不修改,系统扩展性强!重载重载2面向接口编程面试题面试题:1.抽象类可以有构造方法抽象类可以有构造方法,接口不可以接口不可以.2.抽象类中可以有普通成员变量抽象类中可以有普通成员变量,普通方法普通方法.接口不可以接

7、口不可以.3.抽象类中的抽象方法的访问类型不能是抽象类中的抽象方法的访问类型不能是private访问类型访问类型,但接但接口的抽象方法只能是口的抽象方法只能是public.4.抽象类可以包含静态方法抽象类可以包含静态方法,但接口不可以但接口不可以.5.抽象类中静态成员变量的访问类型可以任意抽象类中静态成员变量的访问类型可以任意.但接口只能是但接口只能是Public(static)final类型类型.6.一个类可以实现多个接口一个类可以实现多个接口,但只能继承一个抽象类但只能继承一个抽象类.1 abstract class和和interface有什么区别有什么区别?2面向接口编程设计层面:设计层

8、面:抽象类是某种抽象事物抽象类是某种抽象事物(isa)。接口是一组行为规范接口是一组行为规范(likea)。接口体现了接口体现了“如果你是如果你是则必须能则必须能”的理念的理念语法层面:语法层面:抽象类体现单继承关系;抽象类体现单继承关系;接口可实现多继承。接口可实现多继承。2面向接口编程2面向接口编程面试题(扩展题)面试题(扩展题):2.1接口是否可以继承接口接口是否可以继承接口?2.2接口是否可以继承抽象类?接口是否可以继承抽象类?2.3抽象类是否可以实现接口抽象类是否可以实现接口?2.4抽象类是否可以继承具体类抽象类是否可以继承具体类?2.5抽象类中是否可以有静态的抽象类中是否可以有静态

9、的main方法方法?抽象类与普通类的唯一区别就是不能创建实例对象和允许有抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstrct方法方法!2面向接口编程面向接口编程:面向接口编程:在系统分析和架构中,分清层次和依赖关系,下层不是直接向在系统分析和架构中,分清层次和依赖关系,下层不是直接向其上层提供服务:即不是直接实例化在上层中,而是通过定义其上层提供服务:即不是直接实例化在上层中,而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。口依赖,而不依赖具体类。系统层次间协作关系是系统设计的关键,小

10、到不同类之间的通信,大到各模块之间的交互。本质:面向抽象编程,定义与实现的分离面向抽象编程,定义与实现的分离。2.1.1设计模式四人帮GoF(“四人帮四人帮”,又称,又称GangofFour,即,即ErichGamma,RichardHelm,RalphJohnson&JohnVlissides四人)的四人)的设计模式设计模式,原名,原名DesignPatterns:ElementsofReusableObject-OrientedSoftware,第一次将设计模式提升到理论,第一次将设计模式提升到理论高度,并将之规范化。该书提出了高度,并将之规范化。该书提出了23种基本设计模式。种基本设计模

11、式。3.8六大原则总览3.1单一职责原则(SRP)单一职责原则(SingleResponsibilityPrinciple)定义:应该有且仅有一个原因引起类的变更。通俗言之:一个类只负责一个职责一个类只负责一个职责。单一职责原则:实现高内聚、低耦合的指导方针。问题由来:问题由来:类T负责两个不同的职责:职责P1,职责P2。则职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。总结:总结:接口一定要做到单一职责,类的设计尽量做到一个原因引起变化就行。3.2接口隔离原则(ISP)接口隔离原则(InterfaceSegregationPrinciple)定义:1、客

12、户端不应该依赖它不需要的接口。、客户端不应该依赖它不需要的接口。2、类间的依赖关系应该建立在最小的接口上。、类间的依赖关系应该建立在最小的接口上。通俗言之:不要建立臃肿庞大的接口不要建立臃肿庞大的接口。与单一原则的区别与单一原则的区别单一职责要求的是类和接口单一,注重的是职责,这是业务逻单一职责要求的是类和接口单一,注重的是职责,这是业务逻辑上的划分。而接口隔离原则要求接口的方法尽量少。辑上的划分。而接口隔离原则要求接口的方法尽量少。3.2接口隔离原则(ISP)Eg:设计门的类设计门的类abstractDoorabstractvoidOpen();abstractvoidClose();3.2

13、接口隔离原则(ISP)新需求:新需求:需要门具有报警功能。需要门具有报警功能。解决方案一:在抽象类解决方案一:在抽象类(或接口或接口)Door添加添加alarm方法。方法。abstractDoorabstractvoidOpen();abstractvoidClose();abstractvoidAlarm();3.2接口隔离原则(ISP)问题?问题?违背违背ISP(接口隔离原则接口隔离原则),Alarm方法对于依赖方法对于依赖Door的模块是的模块是多余的。多余的。修改方案:修改方案:1)abstactDoor保留保留Open()、Close(),Alarm由子类扩展。由子类扩展。2)拆分成

14、拆分成interfaceDoor和和interfaceAlarm接口。接口。3)拆分成拆分成abstactDoor和和interfaceAlarm。3.2接口隔离原则(ISP)abstractDoorabstractvoidOpen();abstractvoidClose();InterfaceAlarmablevoidAlarm();classAlarmDoorextendsDoorimplentsAlarmable3.3里氏替换原则(LSP)里氏替换原则(LiskovSubstitutionPrinciple)定义:所有引用基类的地方必须能透明地使用其子类的对象。通俗言之:任何父类出现的地

15、方,子类一定可以出现。任何父类出现的地方,子类一定可以出现。在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。总结:子类可以扩展父类的功能,但不能改变父类原有的功能子类可以扩展父类的功能,但不能改变父类原有的功能3.4依赖倒置原则(DIP)依赖倒置原则(DependenceInversionPrinciple)定义:1、高层模块不应该依赖低层模块,两者都应该依赖于抽象(抽、高层模块不应该依赖低层模块,两者都应该依赖于抽象(抽象类或接口)。象类或接口)。2、抽象(抽象类或接口)不应该依赖于细节(具体实现类)。、抽象(抽象类或接口)不应该依赖于细节(具

16、体实现类)。3、细节(具体实现类)应该依赖抽象。、细节(具体实现类)应该依赖抽象。通俗言之:依赖抽象,不依赖实现。依赖抽象,不依赖实现。总结:面向接口编程面向接口编程3.5开闭原则(OCP)开闭原则(OpenClosePrinciple)定义:一个软件实体如类、模块和函数,应该对扩展开放,对修改关一个软件实体如类、模块和函数,应该对扩展开放,对修改关闭。闭。通俗言之:一个好的系统是在不修改已有源代码的情况下,可以扩展功能。实现开闭原则的关键就是抽象化是抽象化。3.5开闭原则(OCP)在开-闭原则中,不允许修改的是抽象的类或者接口,允许扩展的是具体的实现类,抽象类和接口在开-闭原则中扮演着极其重

17、要的角色。模板方法模式和观察者模式都是开闭原则的极好体现。3.6合成复用原则(CRP)合成复用原则合成复用原则(CompositeReusePrinciple,CARP):要要优先优先使使用对用对象象组合组合(聚合)(聚合)通俗言之:要尽量使用合成/聚合,尽量不要使用继承。继承复用:从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;破坏封装性,把父类实现细节直接暴露给子类(白箱复用);父类发生改变,子类也应改变,类与类之间高耦合。3.6合成复用原则(CRP)组合/聚合复用:耦合度相对较低,可以在运行时动态进行。黑箱复用!如果两个类之间是“Has-A”的关系应使用组合或聚合

18、,如果是“Is-A”关系可使用继承。桥接模式遵循该原则!3.6合成复用原则(CRP)3.6合成复用原则(CRP)3.7迪米特原则(LOD)迪米特原则(LawOfDemeter)定义:指一个对象应该对于其他对象有最少的了解指一个对象应该对于其他对象有最少的了解。问题由来:类与类之间的关系越密切,耦合度越大,当一个类:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。发生改变时,对另一个类的影响也越大。通俗言之:不要跟陌生人说话。类应该对自己需要耦合或调用不要跟陌生人说话。类应该对自己需要耦合或调用的类知道得越少越好的类知道得越少越好。2.1.2设计模式概述设计模式(

19、设计模式(Designpattern)是)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。代码设计经验的总结。为何提倡设计模式?为何提倡设计模式?根本原因是为了代码复用,增加可维护性根本原因是为了代码复用,增加可维护性。设计模式有助于对框架结构的理解,成熟的框架通常使用了多设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式。种设计模式。设计模式通过实现面向对象六大原则,从而达到了代码复用、设计模式通过实现面向对象六大原则,从而达到了代码复用、增加可维护性的目的。增加可维护性的目的。2.2.1设计模式基本元素模式名称模式名称问题问题解决方案解决方案效果效果2.2

20、.2设计模式分类设计模式分为三种类型,共设计模式分为三种类型,共23类。类。创建型模式:创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。结构型模式:结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。行为型模式:行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。2.3.1设计模式之单例模式(Singleton)单例设计模式的特点:1.单例设计模式保证一个类只有一个实例;2.要提供一个访问该类对象实例的全局访问点。单例模式最重要的就是要保证一个类只有一个实

21、例并且这个类保证一个类只有一个实例并且这个类易于被访问易于被访问。一个全局类使得一个对象可以被访问,但是这样做却不能防止你实例化多个对象。2.3.1设计模式之单例模式(Singleton)单例设计模式的实现:1.为了避免其它程序过多的建立该类的对象,先禁止其它程序建立该类对象实例(将构造器私有化)。2.为了方便其它程序访问该类的对象,只好在本类中自定义一个对象,由1可知该对象是static的,并对外提供访问方式。2.3.1设计模式之单例模式(Singleton)单例模式具体实现有两种:懒汉式classSingletonprivatestaticSingletoninstance=null;pr

22、ivateSingleton()publicstaticSingletongetInstance()if(instance=null)instance=newSingleton();returninstance;2.3.1设计模式之单例模式(Singleton)饿汉式classSingletonprivatestaticSingletoninstance=newSingleton();privateSingleton()publicstaticSingletongetInstance()returninstance;2.3.1设计模式之单例模式(Singleton)饿汉式(总结)对象预先加载,

23、线程是安全的,在类创建好的同时对象生成,调用获得对象实例的方法反应速度快,代码简练。懒汉式(总结)对象延迟加载,效率高,只有在使用的时候才实例化对象,若设计不当线程会不安全,代码相对于饿汉式复杂,第一次加载类对象的时候反应不快。2.3.1设计模式之多例模式(MultitonPattern)classMultitonprivatestaticMultitonmulti1=newMultiton();privatestaticMultitonmulti2=newMultiton();privateSingleton()publicstaticSingletongetInstance(intvalu

24、e)if(1=value)returnmulti1;elsereturnmulti2;/多例模式:单例模式的推广。2.3.1设计模式之多例模式(MultitonPattern)classMultitonprivatestaticListlist=newArraryList();privatestaticMultitonmulti1=newMultiton();privatestaticMultitonmulti2=newMultiton();privatestaticfinalintmaxCount=2;/最多的实例数staticlist.add(multi1);list.add(multi2

25、);privateSingleton()publicstaticSingletongetInstance(intvalue)returnlist.get(index);/多例模式:单例模式的推广。2.3.2工厂模式(Factory)工厂模式在java与模式中分为三类:简单工厂模式(静态工厂SimpleFactory)工厂方法模式(FactoryMethod)抽象工厂模式(AbstractFactory)GOF在设计模式一书中,将简单工厂模式看做特殊的工厂方法模式。2.3.2工厂模式(Factory)简单工厂模式(静态工厂SimpleFactory)Creater(工厂角色):是简单工厂的核心。

26、工厂角色可被外部直接调用,创建所需产品对象。Product(抽象产品角色):具体产品类的父类。ConcreteProduct(具体产品类)。2.3.2工厂模式(Factory)publicclassCreater/静态工厂模式publicstaticDogCreateDog(StringdogName)throwsExceptionif(carName.equalsIgnoreCase(“TaiDi)returnnewTaiDi();elseif(carName.equalsIgnoreCase(“MuYang)returnnewMuYang();publicabstractDogpublic

27、voidrun();2.3.2工厂模式(Factory)publicTaidiextendsDogpublicMuYangextendsDog2.3.2工厂模式(Factory)publicclassClientpublicstaticvoidmain(Stringargs)/Dogdog=newTaiDi();/Dogdog=newMuYang();Dogdog=Creater.CreateDog(“TaiDi);2.3.2工厂模式(Factory)静态工厂在创建产品时,通常结合反射一起使用。publicclassCreater/静态工厂模式publicstaticTaiDiCreateDo

28、g(StringcarName)throwsExceptionTaiDitaidiDog=(TaiDi)Class.forName(“zhong.xxx+carName).newInstance();returntaidiDog;问题简单工厂为什么要用静态方法实现?静态方法的继承问题?缺点:对于新产品的加入创建,无能为力!违背开闭原则!2.3.2工厂模式(Factory)工厂方法模式(FactoryMethod)简单工厂模式对增加新产品,无能为力,不符合开闭原则(对扩展开发,对修改封闭)。工厂方法模式是对简单工厂模式的抽象2.3.2工厂模式(Factory)publicabstractclas

29、sFactoryDoggetInstance();publicclassTaiDiFactoryimplementsFactorypublicDoggetInstance()returnnewTaiDi();publicclassMuYangFactoryimplementsFactorypublicDoggetInstance()returnnewMuYang();CreaterConcreteCreaterConcreteCreater2.3.2工厂模式(Factory)publicabstractclassDogpublicabstractvoidrun();publicclassTai

30、DiextendsDogpublicclassMuYangextendsDogpublicvoidrun()publicvoiddoAfraid()System.out.println(“我是MuYang我怕谁!”);ProductConcreteProductConcreteProduct2.3.2工厂模式(Factory)publicstaticvoidmain(Stringargs)Factoryfactory=newTaiDiFatory();Dogdog=factory.getInstance();dog.run();/dog.doAfraid();哪些情况使用工厂模式?1)当客户程

31、序不需要知道要使用对象的创建过程。2)客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。2.3.3抽象工厂模式(AbstractFactory)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。2.3.3抽象工厂模式(AbstractFactory)1.AbstractFactory声明一个创建抽象产品对象的操作接口。2.ConcreteFactory实现创建具体产品对象的操作。3.AbstractProduct为一类产品对象声明一个接口。4.ConcreteProduct定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口。

32、5.Client仅使用由AbstractFactory和AbstractProduct类声明的接口2.3.3抽象工厂模式(AbstractFactory)AbstractFactory:publicinterfaceAbstractFactorypublicCarCreateBmwCar();publicCarCreateBenzCar();2.3.3抽象工厂模式(AbstractFactory)ConcreteFactory:classConcreteSportFactoryimplentsAbstractFactorypublicCarCreateSportBmwCar()returnne

33、wBmwSportsCar();publicISportingCreateSportBenzCar()returnnewBenzSportsCar();2.3.3抽象工厂模式(AbstractFactory)AbstractProduct:publicabstractCarvoidgo();2.3.3抽象工厂模式(AbstractFactory)ConcretePorduct:publicclassBmwSportsCarextendCarpublicvoidgo()System.out.println(BmwSportsCarrun!);publicclassBenzSportsCarext

34、endCarpublicvoidgo()System.out.println(BenzSportsCarrun!);2.3.3抽象工厂模式(AbstractFactory)Client:publicstaticvoidmain(Stringargs)AbstractFactorysportCarFactory=newConcreteSportFactory();Carcar=sportCarFactory.CreateSportBmwCar();/Carcar=sportCarFactory.CreateSportBenzCar();能不能把增加产品家族数量?2.3.4外观模式(Facade)

35、Facade模式2.3.4外观模式(Facade)Facade模式:1定义了一个更高的接口,使子系统更加容易使用;2为子系统中的一组接口提供一个统一的接口。2.3.4外观模式(Facade)Eg:开关电脑模拟程序开关电脑模拟程序(见开关电脑模拟程序文档见开关电脑模拟程序文档)2.3.4外观模式(Facade)核心思想:封装交互,简化调用核心思想:封装交互,简化调用(化繁为简化繁为简)!作用:作用:外部减少与子系统内多个模块的交互,松散耦合;外部减少与子系统内多个模块的交互,松散耦合;让外部能够更简单的使用子系统;让外部能够更简单的使用子系统;大大节省学习时间。大大节省学习时间。2.3.5适配器

36、模式(Adapter)Adapter模式(结构型)模式(结构型)1将一个类的接口转换成客户希望的另外一个接口将一个类的接口转换成客户希望的另外一个接口;2使得原本由于接口不兼容而不能一起工作的那些类可以一起使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。工作。Eg1:电源适配器2.3.5适配器模式(Adapter)Eg2:androidemail显示显示一个ListView的使用涉及了两个部分,一个是数据源DataSource,另外一个是数据源的各项的布局显示ItemLayout。DataSource是不能直接展示在用户面前,ItemLayout才是直接用户,DataSource向I

37、temLayout填充和转换就是一个典型的适配过程,就需要一个适配器对象来参与其中。2.3.5适配器模式(Adapter)示例程序示例程序(见见Adapter-获取电压程序获取电压程序)2.3.5适配器模式(Adapter)Adapter模式(结构型)模式(结构型)它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题。解决接口不相容的问题:复用代码,不修改原有代码。缺点:对于对象适配器来说,更换适配器的实现过程比较复杂。对象适配器和类适配器?2.3.6职责链模式(COR)职责链(ChainofResponsibility):行为型发送方发送一个请求,使多个对象都有机会处理请求,从而避

38、免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。核心思想:给多个对象处理一个请求的机会,从而解耦发送者给多个对象处理一个请求的机会,从而解耦发送者和接受者和接受者。2.3.6职责链模式(COR)适用范围适用范围1有多个对象可以处理同一个请求有多个对象可以处理同一个请求2不能明确指定接收者不能明确指定接收者2.3.6职责链模式(COR)Eg1:公司请假Eg2:brew平台消息机制Eg3:java异常处理trycatch(Exceptione1)catch(Exceptione2)finally2.3.6职责链模式(COR)2.3.7观

39、察者模式(Observer)观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者中涉及了两个对象,一个是观察目标,一个是观察者。观察目标有典型的3个方法:订阅,取消订阅,通知。订阅:增加状态或事件通知的对象取消订阅:删除状态或事件通知对象通知:通知所有订阅了状态和事件的对象。2.3.7观察者模式(Observer)Eg:杂志订阅,杂志是主题,观察者是订阅者。当出版新杂志时候,这个事件会自动通知所有的订阅者。Eg:猫和老鼠2.3.7观察者模式(Observer)观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生

40、改变时,所有依赖于它的对象都得到通知并被自动更新。观察者中涉及了两个对象,一个是观察目标,一个是观察者。观察目标有典型的3个方法:订阅,取消订阅,通知。订阅:增加状态或事件通知的对象取消订阅:删除状态或事件通知对象通知:通知所有订阅了状态和事件的对象。2.3.8中介者模式(Mediator)中介者模式:1用一个中介对象来封装一系列的对象交互;2中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。Eg:android-Activity与IntentDemo程序:Mediator模式-居委会大妈2.3.8中介者模式(Mediator)2.3.8中介者模式(Med

41、iator)2.3.8中介者模式(Mediator)中介者模式本质:封装交互封装交互何时选用中介者模式何时选用中介者模式1如果一组对象之间的通信方式比较复杂,导致相互依赖、结构混乱;2如果一个对象引用很多的对象,并直接跟这些对象交互,导致难以复用该对象。2.3.9模式区别外观模式和中介者模式外观模式和中介者模式1中介者模式主要用来封装多个对象之间相互的交互,多用在系统内部的多个模块之间;而外观模式封装的是单向的交互。2在中介者模式的实现里面,是需要实现具体的交互功能的;而外观模式的实现里面,一般是组合调用或是转调内部实现的功能,通常外观模式本身并不实现这些功能。2.3.9模式区别外观模式和单例

42、模式外观模式和单例模式通常一个子系统只需要一个外观实例,所以外观模式可以和单例模式组合使用,把Facade类实现成为单例。2.3.9模式区别外观模式和抽象工厂模式外观模式和抽象工厂模式外观模式的外观类通常需要和系统内部的多个模块交互,每个模块一般都有自己的接口,所以在外观类的具体实现里面,需要获取这些接口,然后组合这些接口来完成客户端的功能。那么怎么获取这些接口呢?就可以和抽象工厂一起使用,外观类通过抽象工厂来获取所需要的接口,而抽象工厂也可以把模块内部的实现对Facade进行屏蔽,也就是说Facade也仅仅只是知道它从模块中获取的它需要的功能,模块内部的细节Facade也不知道了。2.3.1

43、0状态模式状态模式允许一个对象在其内部状态改变的时候改变其行为。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。这个对象看上去就像是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改意图是让一个对象在其内部状态改变的时候,其行为也随之改变。变。2.3.10状态模式天气案例(疯狂设计模式)天气案例(疯狂设计模式)2.3

44、.11桥接模式桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。应用场景:某个类具有两个或两个以上的维度变化,如果只是使用继承将无法实现这种需要,或者使得设计变得相当臃肿。2.3.11桥接模式2.3.11桥接模式举例来说:面馆供应牛肉面、猪肉面,而且顾客可根据自己的口味选择是否添加辣椒。此时就产生了一个问题,我们如何来应对这种变化:我们是否需要定义辣椒牛肉面、无辣牛肉面、辣椒猪肉面、无辣猪肉面4个子类?如果餐厅还供应羊肉面、韭菜面呢?如果添加辣椒时可选择无辣、微辣、中辣、重辣风味呢?那程序岂非一直忙于定义子类?腾讯笔试题()设计模式将抽象部分与它的实现部分相分离。A、Single

45、ton(单例)B、Bridge(桥接)C、Composite(组合)D、Facade(外观)2.3.12原型模式2.3.9原型模式(Prototype)原型模式原型模式(创建类模式创建类模式):核心是:核心是:PrototypePrototype类,此类满足需满足两个条件:类,此类满足需满足两个条件:1 1)实现)实现CloneableCloneable接口;接口;2 2)重写)重写ObjectObject类中的类中的cloneclone方法方法pubilcinterfaceCloneable2.3.9原型模式(Prototype)原型模式原型模式(创建类模式创建类模式):优势:优势:1 1)

46、创建对象性能优于创建对象性能优于new一个对象一个对象;2 2)简化对象的创建;简化对象的创建;问题:问题:直接在内存中复制数据,因此不会调用到类的构造方法。直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。应用场景:在需要重复地创建相似对象时可以考虑使用原型模式Eg:复制、粘贴2.3.12原型模式Personp=newPerson(23,zhang);Personp1=p;System.out.println(p);System.out.println(p1);问题:堆

47、内存?栈内存?静态区?代码区?Strings=abcStrings=newString(“abc”);?2.3.12原型模式Personp=newPerson(23,zhang);Personp1=(Person)p.clone();System.out.println(p);System.out.println(p1);2.3.12原型模式总结:当克隆的对象只有基本类型,不含引用类型时,可以用浅克隆实现;当克隆的对象含有引用类型时,必须使用深克隆实现。2.3.13装饰者模式Filefile=newFile(hello.txt);FileInputStreamin=newFileInputSt

48、ream(file);BufferedInputStreaminBuffered=newBufferedInputStream(in);DataInputStreambis=newDataInputStream(newBufferedInputStream(newFileInputStream(File);?2.3.13装饰者模式装饰模式以对客户端透明的方式动态地给一个对象附加上更多的责任。装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。是继承关系的一种替代方案。2.3.13建造者模式2.3.9MVC架构模式MVC中的设计模式:观察者、策略、状态、中介者等练习题练习题练习题练习题练习题练习题练习题练习题练习题下面语句创建了几个对象()Strings1=HelloWorld;Strings2=HelloWorld;Strings3=s1;Strings4=newString(HelloWorld);Strings5=newString(HelloWorld);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 营销创新

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