版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
哈尔滨华德学院第1章设计模式简介1.1什么是设计模式设计模式(pattern)是从许多优秀的软件系统中总结出的成功的可复用的设计方案。每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。模式体现的是程序整体的构思,所以有时候它也会出现在分析或者是概要设计阶段模式的核心思想是通过增加抽象层,把变化部分从那些不变部分里分离出来软件工程专业2023/2/131.1什么是设计模式设计模式的四要素模式名称(PatternName)问题(Problem)解决方案(Solution)效果(consequences)软件工程专业2023/2/141.2设计模式的起源软件领域的设计模式起源于建筑学。
1977年,建筑大师Alexander出版了《APatternLanguage:Towns,Building,Construction》一书。受Alexander著作的影响,KentBeck和WardCunningham在1987年举行的一次面向对象的会议上发表了论文:《在面向对象编程中使用模式》。2023/2/1软件工程专业51.2设计模式的起源
目前,被公认在设计模式领域最具影响力的著作是ErichGamma、RichardHelm、RalphJohnson和JohnVlissides在1994年合作出版的著作:《DesignPatterns:ElementsofReusableObject-OrientedSoftware》(中译本《设计模式:可复用的面向对象软件的基本原理》或《设计模式》),该书被广大喜爱者昵称为GOF(GangofFour)之书,被认为是学习设计模式的必读著作,GOF之书已经被公认为是设计模式领域的奠基之作。2023/2/1软件工程专业61.3设计模式的分类设计模式分为三种类型,共23种。创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。2023/2/1软件工程专业71.4什么是框架框架通常定义了应用体系的整体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节。框架主要记录软件应用中共同的设计决策,框架强调设计复用,因此框架设计中必然要使用设计模式设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式,如果你熟悉这些设计模式2023/2/1软件工程专业8第2章面向对象的几个基本原则2.1面向抽象原则设计一个类时,不让该类面向具体的类,而是面向抽象类或接口。包含抽象方法的类称为抽象类,在面向对象的程序设计思想中,抽象类只能做为父类使用,不能被实例化为对象。Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。2023/2/1软件工程专业102.2开-闭原则设计应当对扩展开放,对修改关闭。模块应尽量在不修改原代码的情况下进行扩展。可以在软件完成后对软件进行扩展,加入新的功能。这样,软件就可通过不断的增加新模块满足不断变化的新需求。由于不修改软件原来的模块,不用担心软件的稳定性。2023/2/1软件工程专业112.3里氏代换原则如果调用的是父类的话,那么换成子类也完全可以运行。2023/2/1软件工程专业122.4依赖倒转原则抽象不应该依赖于细节,细节应当依赖于抽象。要针对接口编程,而不是针对实现编程。2023/2/1软件工程专业132.5多用组合少用继承原则设计中避开类继承的缺点,充分使用对象组合的优点。2023/2/1软件工程专业142.6高内聚-低耦合原则如果类中的方法是一组相关的行为,则称该类是高内聚的,反之称为低内聚的。所谓低耦合就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。2023/2/1软件工程专业15第3章UML类图简介3.1类(Class)在UML中,使用一个长方形描述一个类的主要构成,将长方形垂直地分为三层。第1层是名字层,类名字是常规字形,表明该类是具体类,类名字是斜体字形,表明该类是抽象类。第2层是变量层,也称属性层,列出类的成员变量及类型,格式是“变量名字:类型”。第3层是方法层,也称操作层,列出类的方法及返回类型,格式是“方法名字(参数列表):类型”2023/2/1软件工程专业173.1类(Class)2023/2/1软件工程专业18Student+name:String#age:int-money:double+setName(String):void#printMess():void+getAge():intsetAge(int):void-getMoney();名字层
变量层
方法层
+#--protected的private的友好的的public的变量或方法的访问权限是名字前加3.2接口(Interface)表示接口的UML图和表示类的UML图类似,使用一个长方形描述一个接口的主要构成,将长方形垂直地分为三层。第1层是名字层,接口的名字必须是斜体字形,而且需要用<<interface>>修饰名字,并且该修饰和名字分列在2行。第2层是常量层,列出接口中的常量及类型,格式是“常量名字:类型”。第3层是方法层,也称操作层,列出接口中的方法及返回类型,格式是“方法名字(参数列表):类型”。2023/2/1软件工程专业193.2接口(Interface)2023/2/1软件工程专业20<<interface>>Creator
+MAX:int+factoryMethod():Product名字层
常量层
方法层
+public的常量或方法的访问权限是名字前加3.3泛化关系(Generalization)2023/2/1软件工程专业21
对于面向对象语言,UML中所说的泛化关系就是指类的继承关系。如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束。3.4关联关系2023/2/1软件工程专业22
如果A类中成员变量是用B类(接口)来声明的变量,那么A和B的关系是关联关系,称A关联于B。那么UML通过使用一个实线连A和B的UML图,实线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示实线的结束。3.5依赖关系2023/2/1软件工程专业23
如果A类中某个方法的参数用B类(接口)来声明的变量或某个方法返回的数据类型是B类型的,那么A和B的关系是依赖关系,称A依赖于B。那么UML通过使用一个虚线连A和B的UML图,虚线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示虚线的结束。3.6实现关系2023/2/1软件工程专业24
如果一个类实现了一个接口,那么类和接口的关系是实现关系,称类实现接口。UML通过使用虚线连接类和它所实现的接口,虚线起始端是类,虚线的终点端是它实现的接口,但终点端使用一个空心的三角形表示虚线的结束。3.7注释2023/2/1软件工程专业25UML使用注释为类图提供附加的说明。UML在一个带卷角的长方形中显示给出的注释,并使用虚线将这个带卷角的长方形和所它所注释的实体连接起来。第4章工厂模式4.1工厂模式问题在面向对象编程中,最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。一些情况下,new操作符直接生成对象会带来一些问题。创建对象之前必须清楚所要创建对象的类信息,但个别情况下无法达到此要求。许多类型对象的创造需要一系列步骤。在这些情况,新对象的建立就是一个“过程”,而不仅仅是一个操作。2023/2/1软件工程专业274.1工厂模式问题2023/2/1软件工程专业28模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢?4.2工厂模式的解决方案举个例子假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去生产一款宝马车,然后拿来用。后来出现工业革命。用户不用去创建宝马车。因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建。
2023/2/1软件工程专业294.2工厂模式的解决方案举个例子(续)为了满足客户,宝马车系列越来越多,如320i,523i,30li等系列一个工厂无法创建所有的宝马系列。于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列。随着客户的要求越来越高,宝马车必须配置空调。而且这空调必须对应给系列车才能使用。于是这个工厂开始生产宝马车和需要的空调。最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.
2023/2/1软件工程专业304.2工厂模式的解决方案结论产品应该由工厂生产,而不是由客户去生产。客户只需要知道产品在哪买,而不需要知道产品如何制作。类的对象也是一种产品,所以需要对象工厂去负责创建。解决方案:建立一个工厂来创建对象。2023/2/1软件工程专业314.3工厂模式的分类在GOF的《设计模式》一书中,工厂模式就是说明通过工厂类来创建对象的模式。工厂模式分为三类:简单工厂模式工厂方法模式抽象工厂模式这三种模式从上到下逐步抽象,并且更具一般性。GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(FactoryMethod)与抽象工厂模式(AbstractFactory)。将简单工厂模式(SimpleFactory)看为工厂方法模式的一种特例,两者归为一类。
2023/2/1软件工程专业324.3工厂模式的分类简单工厂模式由一个工厂对象决定创建出哪一种产品类的实例工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。2023/2/1软件工程专业334.3工厂模式的分类简单工厂模式(续)该模式中包含的角色及其职责工厂(Creator)角色抽象产品(Product)角色具体产品(ConcreteProduct)角色2023/2/1软件工程专业344.3工厂模式的分类简单工厂模式(续)UML类图2023/2/1软件工程专业354.3工厂模式的分类工厂方法模式定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口。工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭原则’,实现了可扩展。2023/2/1软件工程专业364.3工厂模式的分类工厂方法模式(续)该模式中包含的角色及其职责抽象工厂(Creator)角色具体工厂(ConcreteCreator)角色抽象产品(Product)角色具体产品(ConcreteProduct)角色2023/2/1软件工程专业374.3工厂模式的分类工厂方法模式(续)UML类图2023/2/1软件工程专业384.3工厂模式的分类抽象工厂模式所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。2023/2/1软件工程专业394.3工厂模式的分类抽象工厂模式(续)抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象,而且使用抽象工厂模式还要满足一下条件:系统中有多个产品族,而系统一次只可能消费其中一族产品。同属于同一个产品族的产品以其使用。2023/2/1软件工程专业404.3工厂模式的分类抽象工厂模式(续)该模式中包含的角色及其职责抽象工厂(Creator)角色具体工厂(ConcreteCreator)角色抽象产品(Product)角色具体产品(ConcreteProduct)角色2023/2/1软件工程专业414.3工厂模式的分类抽象工厂模式(续)UML类图2023/2/1软件工程专业42第5章单例模式5.1单例模式问题几乎所有面向对象的程序中,总有一些类的对象需要是唯一的。例如,通过数据库句柄到数据库的连接是独占的。2023/2/1软件工程专业44模式问题:怎样确保一个特殊类的实例是独一无二的(它是这个类的唯一实例),并且这个实例易于被访问呢?5.2单例模式的解决方案举个例子有一个成语叫“独一无二”,以表示事物的珍贵在中国古代,就有“国无二主”的说法,也就是说一个国家只有一个皇帝。2023/2/1软件工程专业455.2单例模式的解决方案一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。因为你的任何代码都能修改全局变量,这将不可避免的引起更多调试的意外。换句话说,全局变量的状态总是会出现一些问题的。让类自身负责保存它的唯一实例(静态变量)。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法(静态方法)。2023/2/1软件工程专业465.2单例模式的解决方案
单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”2023/2/1软件工程专业475.3单例模式结构模式的结构中只包括一个角色单件类(Singleton)单例模式有两种形式饿汉单例,也就是,类被加载的时候就已经创建好了单例。懒汉单例,也就是第一次调用的时候被创建。2023/2/1软件工程专业485.3单例模式结构UML类图2023/2/1软件工程专业49第6章原型模式6.1原型模式问题在软件系统中,客户希望创建一个类对象(产品)时,可能有三种情况:知道产品具体型号(使用new运算符创建)不知道型号,知道特定的需求(使用工厂模式)不知道需求,但想要一个。和已知对象相同的对象。2023/2/1软件工程专业516.1原型模式问题模式问题:当对象的构造函数非常复杂,在生成新对象的时候非常耗时间、耗资源的情况?我们是怎么来创建呢?2023/2/1软件工程专业526.1原型模式解决方案举个例子:例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来。例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递。”顾客说。“寄往什么地方?寄给……?”你问。“和上次差不多一样,只是邮寄给另外一个地址,这里是邮寄地址……”顾客一边说一边把写有邮寄地址的纸条给你。“好!”你愉快地答应,因为你保存了用户的以前邮寄信息,只要复制这些数据,然后通过简单的修改就可以快速地创建新的快递数据了。
2023/2/1软件工程专业536.2原型模式解决方案通过复制(克隆、拷贝)一个指定类型的对象来创建更多同类型的对象。这个指定的对象可被称为“原型”对象,也就是通过复制原型对象来得到更多同类型的对象。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象的模式称为原型模式。原型模式是从一个对象出发得到一个和自己有相同状态的新对象的成熟模式,该模式的关键是将一个对象定义为原型,并为其提供复制自己的方法。2023/2/1软件工程专业546.2原型模式解决方案2023/2/1软件工程专业556.2原型模式解决方案浅拷贝指被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。2023/2/1软件工程专业566.2原型模式解决方案深拷贝指被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。2023/2/1软件工程专业576.3原型模式的结构模式的结构中包括两种角色:抽象原型(Prototype)具体原型(ConcretePrototype)2023/2/1软件工程专业586.3原型模式的结构UML类图2023/2/1软件工程专业59第7章外观模式7.1外观模式问题我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。2023/2/1软件工程专业61模式问题:为了降低复杂性,常常将系统划分为若干个子系统。但是如何做到各个系统之间的通信和相互依赖关系达到最小呢?7.2模式的解决方案举个例子一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。该电源总开关可以同时控制上述所有电器设备。2023/2/1软件工程专业627.2模式的解决方案2023/2/1软件工程专业637.2模式的解决方案2023/2/1软件工程专业647.2模式的解决方案外观模式为系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式的关键是为子系统提供一个称作外观的类,该外观类的实例负责和子系统中类的实例打交道当用户想要和子系统中的若干个类的实例打交道时,可以代替地和子系统的外观类的实例打交道。2023/2/1软件工程专业657.3外观模式的结构模式的结构中包括两种角色子系统(Subsystem)外观(Facade)2023/2/1软件工程专业667.3外观模式的结构UML类图2023/2/1软件工程专业67第8章装饰模式8.1装饰模式的问题若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性。如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上。通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。2023/2/1软件工程专业698.1装饰模式的问题模式问题:你如何组织你的代码使其可以容易的添加基本的或者一些很少用到的特性,而不是直接将额外的代码写在你的类的内部?2023/2/1软件工程专业708.2装饰模式的解决方案举个例子一个鸟只能飞100米,如果让它飞行150米,就必须给它装一个电子翅膀,就可以实现飞行更远的距离。2023/2/1软件工程专业718.2装饰模式的解决方案装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式动态地给一个对象添加一些额外的职责或者行为。就增加功能来说,装饰模式相比生成子类更为灵活。装饰器模式提供了改变子类的灵活方案。装饰器模式在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。2023/2/1软件工程专业728.3装饰模式的结构装饰模式的结构中包括四种角色:抽象组件(Component)具体组件(ConcreteComponent)装饰(Decorator)具体装饰(ConcreteDecotator)2023/2/1软件工程专业738.3装饰模式的结构UML类图2023/2/1软件工程专业74第9章桥接模式9.1桥接模式的问题在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?2023/2/1软件工程专业769.2桥接模式的解决方案举个例子例子1:设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:•第一种设计方案是为每一种形状都提供一套各种颜色的版本。•第二种设计方案是根据实际需要对形状和颜色进行组合。2023/2/1软件工程专业779.2桥接模式的解决方案桥接模式将抽象部分与它的实现部分分离,使得它们都可以独立地变化。将抽象化与实现化脱耦,使得二者可以独立地变化抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物2023/2/1软件工程专业789.2桥接模式的解决方案将抽象化与实现化脱耦,使得二者可以独立地变化脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。2023/2/1软件工程专业799.3桥接模式的结构模式的结构中包括四种角色抽象(Abstraction)实现者(Implementor)细化抽象(RefinedAbstraction)具体实现者(ConcreteImplementor)2023/2/1软件工程专业809.3桥接模式的结构UML类图2023/2/1软件工程专业81第10章命令模式10.1命令模式的问题在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个。我们只需在程序运行时指定具体的请求接收者即可在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?2023/2/1软件工程专业8310.2命令模式的解决方案举个例子电视机遥控器:遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作。2023/2/1软件工程专业8410.2命令模式的解决方案命令模式(CommandPattern):将将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。2023/2/1软件工程专业8510.3命令模式的结构模式的结构中包括四种角色:接收者(Receiver)命令(Command)接口具体命令(ConcreteCommand)请求者(Invoker)2023/2/1软件工程专业8610.3命令模式的结构UML类图2023/2/1软件工程专业87第11章观察者模式11.1观察者模式的问题一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信。当一个对象的状态发生改变时,你如何通知其他对象?是否需要一个动态方案――一个就像允许脚本的执行一样,允许自由连接的方案?2023/2/1软件工程专业8911.2观察者模式的解决方案举个例子用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。2023/2/1软件工程专业9011.2观察者模式的解决方案定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式允许一个对象关注其他对象的状态,并且,观察者模式还为被观测者提供了一种观测结构,或者说是一个主体和一个客体。主体,也就是被观测者,可以用来联系所有的观测它的观测者。客体,也就是观测者,用来接受主体状态的改变观测就是一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运输合作合同模板
- 棉花采购合同2024年度定制版(含质量、交货期限)
- 四下英语三单元教学课件教学课件教学
- 《醒脑开窍针法》课件
- 《鸡大肠杆菌病》课件
- 20恐龙课件教学课件
- 企业借款合同范本
- 机械设备租赁合同协议书
- 深圳市劳动合同经典版
- 《工地建设》课件
- 记叙文写作教学公开课一等奖市赛课获奖课件
- 2.PaleoScan详细操作流程
- 国土空间生态修复规划山水林田湖草
- 矿山开采与土地复垦
- 中国现当代文学知到章节答案智慧树2023年哈尔滨学院
- 毒力回归方程 EXCEL在毒力回归计算中的应用
- 语言学教程(英文版)胡壮麟版
- 猫病诊疗基础-猫的保定(猫病防治技术)
- 个体工商户合作协议书模板
- 中学生不良情绪产生的原因与调节方法的研究
- 仁爱版英语七年级单词总测试-
评论
0/150
提交评论