下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 java设计模式课件耿祥义

java设计模式课件耿祥义.ppt

java设计模式课件耿祥义

yuranghui1288
2013-07-17 0人阅读 举报 0 0 暂无简介

简介:本文档为《java设计模式课件耿祥义ppt》,可适用于IT/计算机领域

封面封面Java设计模式**第一章设计模式简介第一章设计模式简介什么是设计模式**每一个设计模式描述一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样你就能一次一次地使用该方案而不必做重复劳动。设计模式的起源**软件领域的设计模式起源于建筑学。年建筑大师Alexander出版了《APatternLanguage:Towns,Building,Construction》一书。受Alexander著作的影响KentBeck和WardCunningham在年举行的一次面向对象的会议上发表了论文:《在面向对象编程中使用模式》。GOF之著作**目前被公认在设计模式领域最具影响力的著作是ErichGamma、RichardHelm、RalphJohnson和JohnVlissides在年合作出版的著作:《DesignPatterns:ElementsofReusableObjectOrientedSoftware》(中译本《设计模式:可复用的面向对象软件的基本原理》或《设计模式》)该书被广大喜爱者昵称为GOF(GangofFour)之书被认为是学习设计模式的必读著作GOF之书已经被公认为是设计模式领域的奠基之作。学习设计模式的重要性**学习设计模式不仅可以使我们使用好这些成功的模式更重要的是可以使我们更加深刻地理解面向对象的设计思想非常有利于我们更好地使用面向对象语言解决设计中的问题。合理使用模式**.正确使用.避免教条.模式挖掘第二章面向对象的几个基本原则第二章面向对象的几个基本原则面向抽象原则**设计一个类时不让该类面向具体的类而是面向抽象类或接口。第二章面向对象的几个基本原则第二章面向对象的几个基本原则**publicclassCircle{doublerCircle(doubler){thisr=r}publicdoublegetArea(){return*r*r}}publicclassPillar{CirclebottomdoubleheightPillar(Circlebottom,doubleheight){thisbottom=bottomthisheight=height}}第二章面向对象的几个基本原则第二章面向对象的几个基本原则**publicabstractclassGeometry{publicabstractdoublegetArea()}publicclassPillar{GeometrybottomdoubleheightPillar(Circlebottom,doubleheight){thisbottom=bottomthisheight=height}}开闭原则**设计应当对扩展开放对修改关闭。如果您的设计遵守了“开闭原则”那么这个设计一定是易维护的因为在设计中增加新的模块时不必去修改设计中的核心模块。高内聚低耦合原则**如果类中的方法是一组相关的行为则称该类是高内聚的反之称为低内聚的。所谓低耦合就是尽量不要让一个类含有太多的其它类的实例的引用以避免修改系统的其中一部分会影响到其它部分。第四章命令模式第四章命令模式**命令模式(别名:动作事务)将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化对请求排队或记录请求日志以及支持可撤消的操作。CommandPattern(AnotherName:Action,Transaction)Encapsulatearequestasanobject,therebylettingyouparameterizeclientswithdifferentrequests,queueorlogrequests,andsupportundoableoperations一、概述**在许多设计中经常涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道即不希望或无法含有被请求者的引用那么就可以使用命令模式。实例实例在军队作战中指挥官请求三连偷袭敌人但是指挥官不希望或无法直接与三连取得联系那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”。只要能让该作战命令被执行就会实现三连偷袭敌人的目的。二、命令模式的结构与使用**模式的结构中包括四种角色:接收者(Receiver)命令(Command)接口具体命令(ConcreteCommand)请求者(Invoker)**模式的UML类图**模式的结构的描述与使用.接收者(Receiver):CompanyArmyjavapublicclassCompanyArmy{publicvoidsneakAttack(){Systemoutprintln("我们知道如何偷袭敌人,保证完成任务")}}**模式的结构的描述与使用.命令(Command)接口:CommandjavapublicinterfaceCommand{publicabstractvoidexecute()}**模式的结构的描述与使用.具体命令(ConcreteCommand)ConcreteCommandjavapublicclassConcreteCommandimplementsCommand{CompanyArmyarmy含有接收者的引用ConcreteCommand(CompanyArmyarmy){thisarmy=army}publicvoidexecute(){封装着指挥官的请求armysneakAttack()偷袭敌人}}**模式的结构的描述与使用.请求者(Invoker)ArmySuperiorjavapublicclassArmySuperior{Commandcommand用来存放具体命令的引用publicvoidsetCommand(Commandcommand){thiscommand=command}publicvoidstartExecuteCommand(){让具体命令执行execute()方法commandexecute()}}**模式的结构的描述与使用.应用ApplicationjavapublicclassApplication{publicstaticvoidmain(Stringargs){CompanyArmy三连=newCompanyArmy()Commandcommand=newConcreteCommand(三连)ArmySuperior指挥官=newArmySuperior()指挥官setCommand(command)指挥官startExecuteCommand()}}三、命令模式的优点**在命令模式中请求者(Invoker)不直接与接收者(Receiver)交互即请求者(Invoker)不包含接收者(Receiver)的引用因此彻底消除了彼此之间的耦合。命令模式满足“开闭原则”。如果增加新的具体命令和该命令的接受者不必修改调用者的代码调用者就可以使用新的命令对象反之如果增加新的调用者不必修改现有的具体命令和接受者新增加的调用者就可以使用已有的具体命令。四、应用举例四、应用举例模拟带控制开关的小电器。该电器上有四个开关两个一组其中一组负责打开、关闭小电器上的照明灯另一组负责打开、关闭小电器上的摄像头。第五章观察者模式第五章观察者模式**观察者模式(别名:依赖发布订阅)定义对象间的一种一对多的依赖关系当一个对象的状态发生变化时所有依赖于它的对象都得到通知并被自动更新。ObserverPattern(AnotherName:Dependents,PublishSubscribe)Defineaonetomanydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically一、概述**在许多设计中经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣而且这多个对象都希望跟踪那个特殊对象中的数据变化。实例实例某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心很想跟踪“求职中心”中职业需求信息的变化。“求职者”可以让“求职中心”把自己登记下来这样求职中心就会及时通知她最新的职业信息需求。二、模式的结构与使用**观察者模式的结构中包括四种角色:主题(Subject)观察者(Observer)具体主题(ConcreteSubject)具体观察者(ConcreteObserver)**模式的UML类图**模式的结构的描述与使用.主题:SubjectjavapublicinterfaceSubject{publicvoidaddObserver(Observero)publicvoiddeleteObserver(Observero)publicvoidnotifyObservers()}**模式的结构的描述与使用.观察者:ObseverjavapublicinterfaceObserver{publicvoidhearTelephone(StringheardMess)}**模式的结构的描述与使用.具体主题SeekJobCenterjavaimportjavautilArrayListpublicclassSeekJobCenterimplementsSubject{StringmessbooleanchangedArrayList<Observer>personListSeekJobCenter(){personList=newArrayList<Observer>()mess=""changed=false}publicvoidaddObserver(Observero){if(!(personListcontains(o)))personListadd(o)}publicvoiddeleteObserver(Observero){if(personListcontains(o))personListremove(o)}**模式的结构的描述与使用.具体主题SeekJobCenterjavapublicvoidnotifyObservers(){if(changed){for(inti=i<personListsize()i){Observerobserver=personListget(i)observerhearTelephone(mess)}changed=false}}publicvoidgiveNewMess(Stringstr){if(strequals(mess))changed=falseelse{mess=strchanged=true}}}**模式的结构的描述与使用.具体观察者UniversityStudentjavaimportjavaio*publicclassUniverStudentimplementsObserver{SubjectsubjectFilemyFileUniverStudent(Subjectsubject,StringfileName){thissubject=subjectsubjectaddObserver(this)使当前实例成为subject所引用的具体主题的观察者myFile=newFile(fileName)}publicvoidhearTelephone(StringheardMess){try{RandomAccessFileout=newRandomAccessFile(myFile,"rw")outseek(outlength())byteb=heardMessgetBytes()outwrite(b)更新文件中的内容Systemoutprint("我是一个大学生,")Systemoutprintln("我向文件"myFilegetName()"写入如下内容:")Systemoutprintln(heardMess)}catch(IOExceptionexp){Systemoutprintln(exptoString())}}}**模式的结构的描述与使用.具体观察者HaiGuijavaimportjavaio*importjavautilregex*publicclassHaiGuiimplementsObserver{SubjectsubjectFilemyFileHaiGui(Subjectsubject,StringfileName){thissubject=subjectsubjectaddObserver(this)使当前实例成为subject所引用的具体主题的观察者myFile=newFile(fileName)}publicvoidhearTelephone(StringheardMess){try{booleanboo=heardMesscontains("java程序员")||heardMesscontains("软件")if(boo){RandomAccessFileout=newRandomAccessFile(myFile,"rw")outseek(outlength())byteb=heardMessgetBytes()outwrite(b)Systemoutprint("我是一个海归,")Systemoutprintln("我向文件"myFilegetName()"写入如下内容:")Systemoutprintln(heardMess)}else{Systemoutprintln("我是海归,这次的信息中没有我需要的信息")}}catch(IOExceptionexp){Systemoutprintln(exptoString())}}}**模式的结构的描述与使用.应用ApplicationjavapublicclassApplication{publicstaticvoidmain(Stringargs){SeekJobCentercenter=newSeekJobCenter()UniverStudentzhangLin=newUniverStudent(center,"Atxt")HaiGuiwangHao=newHaiGui(center,"Btxt")centergiveNewMess("腾辉公司需要个java程序员。")centernotifyObservers()centergiveNewMess("海景公司需要个动画设计师。")centernotifyObservers()centergiveNewMess("仁海公司需要个电工。")centernotifyObservers()centergiveNewMess("仁海公司需要个电工。")centernotifyObservers()}三、观察者模式的优点**具体主题和具体观察者是松耦合关系。由于主题(Subject)接口仅仅依赖于观察者(Observer)接口因此具体主题只是知道它的观察者是实现观察者(Observer)接口的某个类的实例但不需要知道具体是哪个类。同样由于观察者仅仅依赖于主题(Subject)接口因此具体观察者只是知道它依赖的主题是实现主题(subject)接口的某个类的实例但不需要知道具体是哪个类。观察模式满足“开闭原则”。主题(Subject)接口仅仅依赖于观察者(Observer)接口这样我们就可以让创建具体主题的类也仅仅是依赖于观察者(Observer)接口因此如果增加新的实现观察者(Observer)接口的类不必修改创建具体主题的类的代码。同样创建具体观察者的类仅仅依赖于主题(Observer)接口如果增加新的实现主题(Subject)接口的类也不必修改创建具体观察者类的代码。四、应用举例四、应用举例指挥部希望按时得到水文站测量到的关于水流的信息比如流量、流速等。第六章装饰模式第六章装饰模式**装饰模式(别名:包装器)动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。DecoratorPattern(AnotherName:Wrapper)AttachadditionalresponsibilitiestoanobjectdynamicallyDecoratorsprovideaflexiblealternativetosubclassingforextendingfunctionality一、概述**装饰模式是动态地扩展一个对象的功能而不需要改变原始类代码的一种成熟模式。在装饰模式中“具体组件”类和“具体装饰”类是该模式中的最重要的两个角色。实例**假设系统中有一个Bird抽象类以及Bird类的一个子类:Sparrow。Sparrow类实现了Bird类的fly方法使得Sparrow类创建的对象调用fly方法能连续飞行米。现在用户需要两种鸟必须分别能连续飞行米和米。二、装饰模式模式的结构与使用**装饰模式的结构中包括四种角色:抽象组件(Component)具体组件(ConcreteComponent)装饰(Decorator)具体装饰(ConcreteDecotator)**装饰模式的UML类图**装饰模式的结构的描述与使用.抽象组件:BirdjavapublicabstractclassBird{publicabstractintfly()}**装饰模式的结构的描述与使用.具体组件:SparrowjavapublicclassSparrowextendsBird{publicfinalintDISTANCE=publicintfly(){returnDISTANCE}}**装饰模式的结构的描述与使用.装饰(Decorator):DecoratorjavapublicabstractclassDecoratorextendsBird{protectedBirdbirdpublicDecorator(){}publicDecorator(Birdbird){thisbird=bird}}**装饰模式的结构的描述与使用.具体装饰(ConcreteDecotator):SparrowDecoratorjavapublicclassSparrowDecoratorextendsDecorator{publicfinalintDISTANCE=eleFly方法能飞米SparrowDecorator(Birdbird){super(bird)}publicintfly(){intdistance=distance=birdfly()eleFly()returndistance}privateinteleFly(){装饰者新添加的方法returnDISTANCE}}**装饰模式的结构的描述与使用.应用ApplicationjavapublicclassApplication{publicvoidneedBird(Birdbird){intflyDistance=birdfly()Systemoutprintln("这只鸟能飞行"flyDistance"米")}publicstaticvoidmain(Stringargs){Applicationclient=newApplication()Birdsparrow=newSparrow()BirdsparrowDecorator=newSparrowDecorator(sparrow)BirdsparrowDecorator=newSparrowDecorator(sparrowDecorator)clientneedBird(sparrowDecorator)clientneedBird(sparrowDecorator)}}三、装饰模式的优点**被装饰者和装饰者是松耦合关系。由于装饰(Decorator)仅仅依赖于抽象组件(Component)因此具体装饰只知道它要装饰的对象是抽象组件的某一个子类的实例但不需要知道是哪一个具体子类。装饰模式满足“开闭原则”。不必修改具体组件就可以增加新的针对该具体组件的具体装饰。可以使用多个具体装饰来装饰具体组件的实例。四、应用举例四、应用举例当前系统已有一个抽象类ReadWord该类有一个抽象方法readWord()另外还有一个ReadWord类的子类ReadEnglishWord该类的readWord()方法可以读取一个由英文单词构成的文本文件wordtxt。系统已有类的类图如图所示。目前已有一些客户在使用该系统并使用ReadWord类的对象调用readWord()方法读取文件中的单词。四、应用举例四、应用举例现有部分用户希望使用ReadWord类的对象调用readWord()方法读取文件wordtxt中的单词并希望同时也能得到该单词的汉语解释也有一些用户希望不仅能得到该单词汉语解释也能得到该单词的英文例句。要求不允许修改现有系统的代码以及wordtxt文件对系统进行扩展以满足用户需求。第七章策略模式第七章策略模式**策略模式(别名:政策)定义一系列算法把它们一个个封装起来并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。StrategyPattern(AnotherName:Policy)Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeableStrategyletsthealgorithmvaryindependentlyfromclientsthatuseit一、概述**策略模式是处理算法的不同变体的一种成熟模式策略模式通过接口或抽象类封装算法的标识即在接口中定义一个抽象方法实现该接口的类将实现接口中的抽象方法。在策略模式中封装算法标识的接口称作策略实现该接口的类称作具体策略。实例**策略模式是处理算法的不同变体的一种成熟模式策略模式通过接口或抽象类封装算法的标识即在接口中定义一个抽象方法实现该接口的类将实现接口中的抽象方法。在策略模式中封装算法标识的接口称作策略实现该接口的类称作具体策略。二、策略模式的结构与使用**策略模式的结构中包括三种角色:策略(Strategy)具体策略(ConcreteStrategy)上下文(Context)**策略模式的UML类图**策略模式的结构的描述与使用.策略(Strategy):ComputablejavapublicinterfaceComputableStrategy{publicabstractdoublecomputeScore(doublea)}**策略模式的结构的描述与使用.具体策略(ConcreteStrategy):StrategyOnejavapublicclassStrategyOneimplementsComputableStrategy{publicdoublecomputeScore(doublea){doublescore=,sum=for(inti=i<alengthi){sum=sumai}score=sumalengthreturnscore}}**策略模式的结构的描述与使用.具体策略(ConcreteStrategy):StrategyTwojavapublicclassStrategyTwoimplementsComputableStrategy{publicdoublecomputeScore(doublea){doublescore=,multi=intn=alengthfor(inti=i<alengthi){multi=multi*ai}score=Mathpow(multi,n)returnscore}}**策略模式的结构的描述与使用.具体策略(ConcreteStrategy):StrategyThreejavaimportjavautilArrayspublicclassStrategyThreeimplementsComputableStrategy{publicdoublecomputeScore(doublea){if(alength<=)returndoublescore=,sum=Arrayssort(a)for(inti=i<alengthi){sum=sumai}score=sum(alength)returnscore}}**策略模式的结构的描述与使用.上下文:GymnasticsGamejavapublicclassGymnasticsGame{ComputableStrategystrategypublicvoidsetStrategy(ComputableStrategystrategy){thisstrategy=strategy}publicdoublegetPersonScore(doublea){if(strategy!=)returnstrategycomputeScore(a)elsereturn}}**策略模式的结构的描述与使用.应用:ApplicationjavapublicclassApplication{publicstaticvoidmain(Stringargs){GymnasticsGamegame=newGymnasticsGame()gamesetStrategy(newStrategyOne())Personzhang=newPerson()zhangsetName("张三")doublea={,,,,,}Personli=newPerson()lisetName("李四")doubleb={,,,,,}zhangsetScore(gamegetPersonScore(a))lisetScore(gamegetPersonScore(b))Systemoutprintln("使用算术平均值方案:")Systemoutprintf("s最后得分:fn",zhanggetName(),zhanggetScore())Systemoutprintf("s最后得分:fn",ligetName(),ligetScore())gamesetStrategy(newStrategyTwo())zhangsetScore(gamegetPersonScore(a))lisetScore(gamegetPersonScore(b))Systemoutprintln("使用几何平均值方案:")Systemoutprintf("s最后得分:fn",zhanggetName(),zhanggetScore())Systemoutprintf("s最后得分:fn",ligetName(),ligetScore())**策略模式的结构的描述与使用.应用:ApplicationjavagamesetStrategy(newStrategyThree())zhangsetScore(gamegetPersonScore(a))lisetScore(gamegetPersonScore(b))Systemoutprintln("使用(去掉最高、最底)算术平均值方案:")Systemoutprintf("s最后得分:fn",zhanggetName(),zhanggetScore())Systemoutprintf("s最后得分:fn",ligetName(),ligetScore())}}classPerson{StringnamedoublescorepublicvoidsetScore(doublet){score=t}publicvoidsetName(Strings){name=s}publicdoublegetScore(){returnscore}publicStringgetName(){returnname}}三、策略模式的优点**上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例但不需要知道具体是哪一个类。策略模式满足“开闭原则”。当增加新的具体策略时不需要修改上下文类的代码上下文就可以引用新的具体策略的实例。第八章适配器模式第八章适配器模式**适配器模式(别名:包装器)将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。AdapterPattern(AnotherName:Wrapper)ConverttheinterfaceofaclassintoanotherinterfaceclientsexpectAdapterletsclassesworktogetherthatcouldn'totherwisebecauseofincompatibleinterfaces一、概述**适配器模式是将一个类的接口(被适配者)转换成客户希望的另外一个接口(目标)的成熟模式该模式中涉及有目标、被适配者和适配器。适配器模式的关键是建立一个适配器这个适配器实现了目标接口并包含有被适配者的引用。实例**用户已有一个两相的插座但最近用户又有了一个新的三相插座。用户现在已经有一台洗衣机和一台电视机洗衣机按着三相插座的标准配有三相插头而电视机按着两相插座的标准配有两相插头。现在用户想用新的三相插座来使用洗衣机和电视机。二、适配器模式的结构与使用**模式的结构中包括三种角色:目标(Target)被适配者(Adaptee)适配器(Adapter)**模式的UML类图**模式的结构的描述与使用.目标(Target):ThreeElectricOutletjavapublicinterfaceThreeElectricOutlet{publicabstractvoidconnectElectricCurrent()}**模式的结构的描述与使用.被适配者(Adaptee):TwoElectricOutletjavapublicinterfaceTwoElectricOutlet{publicabstractvoidconnectElectricCurrent()}**模式的结构的描述与使用.适配器(Adapter)TreeElectricAdapterjavapublicclassTreeElectricAdapterimplementsThreeElectricOutlet{TwoElectricOutletoutletTreeElectricAdapter(TwoElectricOutletoutlet){thisoutlet=outlet}publicvoidconnectElectricCurrent(){outletconnectElectricCurrent()}}**模式的结构的描述与使用.应用ApplicationjavapublicclassApplication{publicstaticvoidmain(Stringargs){ThreeElectricOutletoutletWashwash=newWash()outlet=washSystemoutprintln("使用三相插座接通电流:")outletconnectElectricCurrent()TVtv=newTV()TreeElectricAdapteradapter=newTreeElectricAdapter(tv)outlet=adapterSystemoutprintln("使用三相插座接通电流:")outletconnectElectricCurrent()}}**模式的结构的描述与使用.应用ApplicationjavaclassWashimplementsThreeElectricOutlet{StringnameWash(){name="黄河洗衣机"}Wash(Strings){name=s}publicvoidconnectElectricCurrent(){turnOn()}publicvoidturnOn(){Systemoutprintln(name"开始洗衣物。")}}**模式的结构的描述与使用.应用ApplicationjavaclassTVimplementsTwoElectricOutlet{StringnameTV(){name="长江电视机"}TV(Strings){name=s}publicvoidconnectElectricCurrent(){turnOn()}publicvoidturnOn(){Systemoutprintln(name"开始播放节目。")}}三、适配器模式的优点**目标(Target)和被适配者(Adaptee)是完全解耦的关系。适配器模式满足“开闭原则”。当添加一个实现Adaptee接口的新类时不必修改AdapterAdapter就能对这个新类的实例进行适配。第九章责任链模式第九章责任链模式**责任链模式使多个对象都有机会处理请求从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链并沿着这条链传递该请求直到有一个对象处理它为止。ChainofResponsibilityPatternAvoidcouplingthesenderofarequesttoitsreceiverbygivingmorethanoneobjectachancetohandletherequestChainthereceivingobjectsandpasstherequestalongthechainuntilanobjecthandlesit一、概述**责任链模式是使用多个对象处理用户请求的成熟模式责任链模式的关键是将用户的请求分派给许多对象这些对象被组织成一个责任链即每个对象含有后继对象的引用并要求责任链上的每个对象如果能处理用户的请求就做出处理不再将用户的请求传递给责任链上的下一个对象如果不能处理用户的请求就必须将用户的请求传递给责任链上的下一个对象。一、实例**用户提交一个人的身份证号码想知道该人是在北京、上海或者天津居住。二、责任链模式的结构与使用**模式的结构中包括两种角色:处理者(Handler)具体处理者(ConcreteHandler)**模式的UML类图**模式的结构的描述与使用.处理者(Handler):HandlerjavapublicinterfaceHandler{publicabstractvoidhandleRequest(Stringnumber)publicabstractvoidsetNextHandler(Handlerhandler)}**模式的结构的描述与使用.具体处理者(ConcreteHandler):Beijingjavaimportjavautil*publicclassBeijingimplementsHandler{privateHandlerhandlerprivateArrayList<String>numberListBeijing(){numberList=newArrayList<String>()numberListadd("")numberListadd("")numberListadd("")numberListadd("")}publicvoidhandleRequest(Stringnumber){if(numberListcontains(number))Systemoutprintln("该人在北京居住")else{Systemoutprintln("该人不在北京居住")if(handler!=)handlerhandleRequest(number)}}publicvoidsetNextHandler(Handlerhandler){thishandler=handler}}**模式的结构的描述与使用.具体处理者(ConcreteHandler):Shanghaijavaimportjavautil*publicclassShanghaiimplementsHandler{privateHandlerhandlerprivateArrayList<String>numberListShanghai(){numberList=newArrayList<String>()numberListadd("

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/309

java设计模式课件耿祥义

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利