您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 软件工程-10-面向对象设计-设计模式
软件工程第十章面向对象设计设计模式简介每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。建筑设计师ChristopherAlexander软件设计中设计模式的理解是:•优秀的设计范例•从优秀设计方案中发现和总结出来的经验•在实践中反复出现的设计问题的优秀解决方案•设计者相互交流的基本术语•培养优秀设计师的一条捷径不是:•面向对象设计的框架•可供简单组合的设计元件•发明创造出来的创新思路•解决面向对象设计问题的完整方案框架在设计模式中:框架(Framework)是构成一类特定软件可复用设计的一组相互协作的类框架可以认为是一个适用于某个领域的软件包。这个软件包提供了相应领域的各个问题的解决方法。框架与设计模式的区别设计模式和框架针对的问题域不同•设计模式针对面向对象的问题域;•框架针对特定业务的问题域;设计模式比框架更为抽象•设计模式在碰到具体问题后,才能产生代码•框架已经可以用代码表示。设计模式是比框架更小的体系结构元素•框架中可以包括多个设计模式。为什么要使用设计模式复用设计方案•设计人员不必再为普遍、重复的问题重新设计解决方案建立通用的术语•交流与协作都需要一个共同的词汇基础、一个对问题的共同观点。设计模式在项目的分析和设计阶段提供了一个通用的参考点优化系统内部的结构•实际的设计过程中,设计人员更多的考虑如何解决业务问题,对于软件内部结构考虑较少,设计模式帮助解决这方面问题《设计模式》中建议的几点策略针对接口编程优先使用对象组合,而不是类继承找到并封装变化点分类创建型(Creational)•解决如何创建对象的问题。结构型(Structural)•解决如何正确的组合类或对象的问题。行为型(Behavioral)•解决类或对象之间如何交互和如何分配职责的问题。创建型结构型行为型FactoryMethodAbstractFactoryBuilderPrototypeSingletonAdapter_ClassAdapter_ObjectBridgeCompositeDecoratorFacadeFlyweightProxyInterpreterTemplateMethodChainofResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor23种设计模式一览表设计模式之Factory-工厂模式工厂模式它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类。当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到FactoryMethod模式了。FactoryMethod模式结构Product:需要创建的产品的抽象类。ConcreteProduct:Product的子类,一系列具体的产品。Creator:抽象创建器接口,声明返回Product类型对象的FactoryMethod。ConcreteCreator:具体的创建器,重写Creator中的FactoryMethod,返回ConcreteProduct类型的实例。客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。publicclassFactory{publicstaticSamplecreator(intwhich){//getClass产生Sample一般可使用动态类装载装入类。if(which==1)returnnewSampleA();elseif(which==2)returnnewSampleB();}}例子:程序的一种报错的方式1、定义Trace接口publicinterfaceTrace{//turnonandoffdebuggingpublicvoidsetDebug(booleandebug);//writeoutadebugmessagepublicvoiddebug(Stringmessage);//writeoutanerrormessagepublicvoiderror(Stringmessage);}publicclassFileTraceimplementsTrace{privatejava.io.PrintWriterpw;privatebooleandebug;publicFileTrace()throwsjava.io.IOException{//arealFileTracewouldneedtoobtainthefilenamesomewhere//fortheexampleI'llhardcodeitpw=newjava.io.PrintWriter(newjava.io.FileWriter(c:\trace.log));}publicvoidsetDebug(booleandebug){this.debug=debug;}publicvoiddebug(Stringmessage){if(debug){//onlyprintifdebugistruepw.println(DEBUG:+message);pw.flush();}}publicvoiderror(Stringmessage){//alwaysprintouterrorspw.println(ERROR:+message);pw.flush();}}2、实现接口(1)实现接口(2)publicclassSystemTraceimplementsTrace{privatebooleandebug;publicvoidsetDebug(booleandebug){this.debug=debug;}publicvoiddebug(Stringmessage){if(debug){//onlyprintifdebugistrueSystem.out.println(DEBUG:+message);}}publicvoiderror(Stringmessage){//alwaysprintouterrorsSystem.out.println(ERROR:+message);}}对具体Trace类的使用//...somecode...SystemTracelog=newSystemTrace();//...code...log.debug(enteringlog);//...etc...存在什么问题?运用Factory模式改善程序结构publicclassTraceFactory{publicstaticTracegetTrace(){returnnewSystemTrace();}}对于Trace的引用,只需调用TraceFactory.getTrace()代码清单6//...somecode...Tracelog=newTraceFactory.getTrace();设计模式之AbstractFactory–抽象工厂模式核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。适用性一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库,而只想显示它们的接口而不是实现时。抽象工厂方法示意图publicabstractclassFactory{publicabstractSamplecreator();publicabstractSample2creator(Stringname);}publicclassSimpleFactoryextendsFactory{publicSamplecreator(){.........returnnewSampleA}publicSample2creator(Stringname){.........returnnewSample2A}}publicclassBombFactoryextendsFactory{publicSamplecreator(){......returnnewSampleB}publicSample2creator(Stringname){......returnnewSample2B}}调用Factoryfactory=newSampleFactory();SamplesampleA=Factory.create();sampleA.doSomething();设计模式之Builder-建造模式将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。建造模式示意图publicinterfaceBuilder{//创建部件A,比如创建汽车车轮voidbuildPartA();//创建部件B比如创建汽车方向盘voidbuildPartB();//创建部件C比如创建汽车发动机voidbuildPartC();//返回昀后组裝成品结果(返回昀后裝配好的汽车)//成品的组裝过程不在这里进行,而是转移到下面的Director类別中进行。//从而实现了解耦过程和部件ProductgetResult();}publicclassDirector{privateBuilderbuilder;publicDirector(Builderbuilder){this.builder=builder;}//將部件partApartBpartC昀后组成复杂物件//这里是將车轮方向盘和发动机组裝成汽车的过程publicvoidconstruct(){builder.buildPartA();builder.buildPartB();builder.buildPartC();}}publicclassConcreteBuilderimplementsBuilder{PartpartA,partB,partC;publicvoidbuildPartA(){//这里是具体如何构建partA的代码};publicvoidbuildPartB(){//这里是具体如何构建partB的代码};publicvoidbuildPartC(){//这里是具体如何构建partB的代码};publicProductgetResult(){//返回昀后组装成品结果};}例子在全球建房系统中,用户希望看到同样结构下,不同风格房屋的外观。比如:这个房子有一个地板,一个天花板,四面墙,一个门,一个窗户。他希望看到中国风格房屋和希腊风格房屋的相应式样。1)创建一个生成器(Buider)类:ClassHouseBuider{BuildHouse(){}BuildWall(int){}BuildDoor(int){}BuildWindow(int){}BuildFloor(){}BuildCeiling(){}BuildPillar(){}GetHouse(){returnNull;}}2)对每一种风格都定义一个具体的生成器(ConcreteBuilder)类:ChinaHouseBuilder:HouseBuilderGreeceHouseBuilder:HouseBuilder…应用ClassHosueSystem{objectCreate(builderHouseBuilder){builder.BuildHouse();builder.BuildFloor();builder.BuildCeiling();builder.BuildWall(1);builder.BuildWall(2);builder.BuildWall(3);builder.BuildWall(4);builder.D
本文标题:软件工程-10-面向对象设计-设计模式
链接地址:https://www.777doc.com/doc-5454871 .html