




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 结构型设计模式n目录n6.1 适配器模式n6.2 装饰模式n6.3 桥接模式n6.4 享元模式n6.5 外观模式n6.6 代理模式n6.7 组合模式6.1 适配器(Adapter)模式一.适配器模式的由来 二.适配器模式的意图和适用性三.适配器模式结构及参与者 四.应用举例五.效果分析6.1.1 适配器模式的由来nAdapter模式解决的问题在生活中经常会遇到:比如我们有一个team为外界提供S类服务,但是我们team里面没有能够完成此项任务的member,然后我们得知有A可以完成这项服务。为了保证我们对外的服务类别的一致性(提供S服务),我们有以下两种方式解决这个问题: 1)把A直接
2、招安到我们team为我们工作,提供S服务的时候让A去办就是了; 2)A可能在别的地方有工作,并且不准备接受我们的招安,于是我们team可以想这样一种方式解决问题:我们安排B去完成这项任务,并让B做好A的工作,让B工作的时候可以向A请教,因此B就是一个复合体(提供S服务,但是是A的继承弟子)。 6.1.1 适配器模式的由来nAdapter模式用途n实际上在软件系统设计和开发中,这种问题会经常遇到:我们为了完成某项工作购买了一个第三方的库来加快开发。这就带来了一个问题:我们在应用程序中已经设计好了功能接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作,A
3、dapter模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口。 6.1.2 适配器模式意图和适用性n将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。6.1.2 适配器模式意图和适用性n你想使用一个已经存在的类,而它的接口不符合你的要求。n你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。n(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。n适配器模式分为类模式
4、适配器和对象模式适配器。Adapter Pattern(类模式)结构图 Adapter Pattern(对象模式)结构图 6.1.3 适配器模式结构及参与者n类适配器和对象适配器有不同的权衡。类适配器用一个具体的adapter类对adapater和target进行匹配。结果是当我们想要匹配一个类及以及所有它的子类时,类adapter将不能胜任工作。使得adapter可以重定义adaptee的部分行为,因为adapter时adaptee的一个子类。仅仅引入了一个对象,并不需要额外的指针以间接得到adaptee。n对象适配器则允许一个adapter与多个adaptee(即adaptee本身以及它的
5、所有子类)同时工作。Adapter也可以一次给所有的adaptee添加功能。使得重定义adaptee的行为比较困难。这就需要生成adaptee的子类并且使得adapter引用这个子类而不是引用adapter本身。6.1.3 适配器模式意图和适用性class Target class Target public: public: virtual void Request(); virtual void Request(); ;class Adaptee class Adaptee public: public: void SpecificRequest(); void SpecificReque
6、st(); ;class Adapter:public Target,private Adapteeclass Adapter:public Target,private Adaptee/同时继承同时继承TargetTarget和和AdapateeAdapatee public: public: void Request(); void Request(); ; ; void Adapter:Request() void Adapter:Request() this-SpecificRequest(); this-SpecificRequest(); /通过继承实现通过继承实现AdapteeA
7、daptee的方法的方法SpecificRequestSpecificRequest () () 代码说明:类模式6.1.4 应用举例class Target public: virtual void Request(); ; class Adaptee public: void SpecificRequest(); ; class Adapter:public Target public: Adapter(Adaptee* ade); /产生一个产生一个Adaptee对象对象Adapter(); void Request(); private: Adaptee* _ade; ; Adapte
8、r:Adapter(Adaptee* ade) this-_ade = ade; /传递传递Adaptee对象到对象到Adapter void Adapter:Request() _ade-SpecificRequest(); /适配器调用适配器调用SpecificRequest()方法方法 int main(int argc,char* argv) Adaptee* ade = new Adaptee; Target* adt = new Adapter(ade); adt-Request(); /实现实现Target的对象访问的对象访问SpecificRequest()方法方法return
9、 0; 代码说明:对象模式6.1.5 效果分析n优点:方便设计者可以自由定义接口,而不用担心匹配的问题。n缺点:属于静态结构 ,由于只能单继承,所以不适用于多种不同的源适配到同一个目标。6.2 装饰(Decorator)模式一.装饰模式的由来二.装饰模式意图及适用性三.装饰模式结构和参与者 四.应用举例五.效果分析6.2.1 装饰模式的由来n装饰模式动态地给一个对象添加额外的职责。不论一幅画有没有画框都可以挂在墙上,画就是被装饰者。但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。而玻璃画框就是装饰。6.2.1 装
10、饰模式的由来nDecorator模式的提出:n在OO设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定一个新类继承自定义好的类,这样会带来一个问题。通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深。 n而Decorator提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。6.2.2 Decorator模式意图和适用性n动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。6.2.2 Decorator模式意图和适用性以下情况使用Decorator模式
11、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况时因为类定义被隐藏,或类定义不能用于生成子类。Decorator Pattern结构图 6.2.3 Decorator模式结构和参与者Decorator subclasses are free to add operations for specific functionality. For example, ScrollDecorators ScrollTo operation lets o
12、ther objects scroll the interface if they know there happens to be a ScrollDecorator object in the interface. TextViewdraw()DecoratorVisualComponentdraw()+componentcomponent.draw()ScrollDecoratorscrollPositiondraw()scrollto()BorderDecoratorborderWidthdraw()drawBorder()super.draw()drawBorder()draw()n
13、通过结构图中的ConcreteComponent和Decorator有一个公共基类,就可以利用OO中多态的思想来实现只要是Component型别的对象都可以提供修饰操作的类,这种情况下你就算新建了100个 Component型别的类ConcreteComponent,也都可以由Decorator一个类搞定。这也正是Decorator模式的关键和威力所在了。 6.2.3 Decorator模式结构和参与者class Component /定义一个对象接口,可以给这些对象动态地添加职责定义一个对象接口,可以给这些对象动态地添加职责 public: virtual void Operation();
14、 protected: Component(); ; class ConcreteComponent:public Component/定义一个对象,可以给这个对象添加一些职责定义一个对象,可以给这个对象添加一些职责 public: void Operation(); ; class Decorator:public Component/ 维持一个指向维持一个指向Component对象的指针,并定义一个与对象的指针,并定义一个与Component一致的一致的接口接口 public: Decorator(Component* com); protected: Component* _com; ;
15、 class ConcreteDecorator:public Decorator /向组件添加职责向组件添加职责 public: ConcreteDecorator(Component* com); ConcreteDecorator(); void Operation(); void AddedBehavior(); ; 6.2.4 代码说明Decorator:Decorator(Component* com) this-_com = com; Decorator:Decorator() delete _com; void ConcreteDecorator:Operation() _co
16、m-Operation(); this-AddedBehavior(); int main(int argc,char* argv) /Decorator将请求转发给它的将请求转发给它的Component对象,并有可能在转发前后执行一些附加的动对象,并有可能在转发前后执行一些附加的动作作Component* com = new ConcreteComponent();Decorator* dec = new ConcreteDecorator(com); dec-Operation(); /隐藏了隐藏了ConcreteComponent和和ConcreteDecoratordelete dec
17、; return 0; 6.2.4 代码说明6.2.5 效果分析n装饰模式的优缺点:使用Decorator模式可以很容易地向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时添加和删除职责。相比之下,继承机制要求为每个添加的职责创建一个新的子类,这会产生很多新的类,并会增加系统的复杂度。使用Decorator模式可以很容易地重复添加一个特性,而两次继承特性类则极容易出错。 6.2.5 效果分析n装饰模式的优缺点:避免在层次结构高层的类有太多的特征:nDecorator模式下,你可以定义一个简单的类,并用Decorator类给他逐渐地添加功能,这样可以从简单的部件组合出复杂的功能。具有低
18、依赖性和低复杂性。有许多小对象n采用Decorator模式进行系统设计往往会产生许多看上去类似的小对象,尽管对于了解这些系统的人来说,很容易进行定制,但是很难学习这些系统,排错也很困难。6.3 桥接(Bridge)模式一.桥接模式的由来 二.桥接模式的意图和适用性三.桥接模式结构及参与者 四.应用举例五.效果分析6.3.1 桥接模式的由来n如果一个抽象类或接口有多个具体实现(子类、concrete subclass),这些子类之中有内容概念上重叠那么需要我们把抽象共同部分和行为共同部分各自独立开来,原来是准备放在一个接口里,现在需要设计两个接口:抽象接口和行为接口,分别放置抽象和行为.n但是,
19、我们注意到:上面四个子类中有概念重叠,可从另外一个角度进行考虑,这四个类实际是两个角色的组合:抽象 和行为,其中抽象为:中杯和大杯;行为为:加奶 不加奶(如加橙汁 加苹果汁). n我们从分离抽象和行为的角度,使用Bridge模式来实现。 n问题说明n一个典型的应用例子就是相同模块的跨平台使用设计模块A和B;希望模块A和B能应用在X操作系统上,让A和B继承X操作系统的接口;希望模块A和B能应用在Y操作系统上,让A和B继承Y操作系统的接口,以此类推问题:模块A和B缺乏复用性。解决:抽象出统一的操作系统类的接口连接模块A和B的平台无关接口,通过桥接两个抽象模块来消除模块间的继承耦合,提高复用性。6.
20、3.1 桥接模式的由来问题说明6.3.1 桥接模式的由来6.3.2 桥接模式的意图和适用性n传统地,当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义该抽象的接口,而具体的子类则用不同的方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改。扩充和重用。n桥接模式的作用就是将抽象部分与实际部分分离,使它可以独立的变化。 6.3.2 桥接模式的意图和适用性以下一些情况使用Bridge模式:n你不希望在抽象和它的实现部分之间有一个固定的绑定关系。n(C+)你想对客户完全隐藏抽象的实现部分。在C+中,类的表示在类接口中是
21、可见的。6.2.3 桥接模式结构及参与者6.2.3 桥接模式结构及参与者n其中,Abstraction定义抽象类的接口,它维护了一个指向Implementor类型对象的指针;nRefinedAbstraction扩充由Abstraction定义的接口;nImplementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于和谐基本操作的较高层次操作;nConcreteImplementor实现Implementor接口并定义它的具体实现;Abstract
22、ion将client的请求转发给它的Implementor对象。 6.2.4 应用举例CarFordToyotaSportyTruckSportyFordToyotaTruckFordTruckSportyToyotaq Apply the Bridge Design PatternIntent: Decouple a class abstraction from its implementation. - You might use Bridge when you might otherwise be tempted to use multiple inheritance.FordToyot
23、aSportyTruckCarCarManufacturernBridge模式有以下一些优点:n1) 分离接口及其实现部分 一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。n将Abstraction与Implementor分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译 Abstraction类和它的客户程序。为了保证一个类库的不同版本之间的二进制兼容性,一定要有这个性质。n另外,接口与实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分仅需知道Abstraction和Implementor即
24、可。6.3.5 效果分析6.3.5 效果分析n2) 提高可扩充性 你可以独立地对Abstraction和Implementor层次结构进行扩充。n3) 实现细节对客户透明 你可以对客户隐藏实现细节,例如共享 Implementor对象以及相n应的引用计数机制(如果有的话)。6.5 外观(Facade)模式一、外观模式的由来二、外观模式的意图及适用性三、外观模式的结构及参与者四、应用举例五、效果分析6.5.1 外观模式的由来毕业生教务处公安处后勤处图书馆饭卡饭卡余额借书证借书证押金身份证、学生证派遣证学生证毕业证、学位证6.5.1 外观模式的由来毕业生毕业手续代办处教务处后勤处图书馆公安处学生证
25、 身份证 借书证 饭卡毕业证 学位证 派遣证 饭卡余额 借书证押金6.5.1 外观模式的由来6.5.1 外观模式的由来6.5.2 外观模式的意图及适用性为复杂子系统提供一个简单接口,定义一个高层接口,使子系统更加容易使用解除客户程序与抽象类具体实现部分的依赖性,有利于移植和更改当需要构建层次结构的子系统时,使用Faade模式定义每层的入口点。如果子系统间相互依赖,他们只需通过Faade进行通讯6.5.3 外观模式的结构和参与者6.5.3 外观模式的结构和参与者Faadeu知道哪些子系统类负责处理请求u将客户的请求代理给适当的子系统对象Subsystem Classesu实现子系统的功能u处理由
26、Faade 对象指派的任务u没有Faade的任何相关信息6.5.4 应用举例6.5.4 应用举例6.5.4 应用举例6.5.4 应用举例6.5.5 效果分析对客户端屏蔽子系统组件,减少客户端使用对象的数目实现了子系统与客户之间松耦合的关系,使得子系统组件的变化不会影响到客户并不限制客户应用子系统类6.6 代理(Proxy)模式一、代理模式的由来二、代理模式的意图及适用性三、代理模式的结构及参与者四、应用举例五、效果分析6.6.1 代理模式的由来n某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.下面举两个具体的例子: n(1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示
27、出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片.6.6.1 代理模式的由来n(2)如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.6.6.1 代理模式的由来n 如何应对这种变化?如何提供一种机制让原本交互起来比较困难的两个对象实现畅通无阻地交流呢?并且从而保持系统的结构不随着需求改变而轻易改变?这就是要说的代理模式。 6.6.2 代理模式的意图和适用性n模式的意图 为其他对象提供一种代理以控制对这个对象
28、的访问。6.6.2 代理模式的意图和适用性n在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理模式。以下情况可以使用代理模式:n1. 远程代理为一个对象在不同的地址空间提供局部代表。n2. 虚代理在需要创建开销很大的对象时缓存对象信息。6.6.2 代理模式的意图和适用性n3. 保护代理控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。n4.智能指引取代了简单的指针,它在访问对象时执行一些附加操作。它的典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它 。当第一次引用一个持久对象时,将它装入内存。在访问一个实际对象前,检查是否已经锁定了它,
29、以确保其他对象不能改变它。6.6.3 代理模式的结构和参与者6.6.3 代理模式的结构和参与者n代理(代理(Proxy )1.保存一个引用使得代理可以访问实体。2.提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。3.控制对实体的存取,并可能负责创建和删除它。 4.其他功能依赖于代理的类型:远程代理(Remote Proxy)负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。虚代理(Virtual Proxy)可以缓存实体的附加信息,以便延迟对它的访问。保护代理(Protection Proxy)检查调用者是否具有实现一个请求所必需的访问权限6.6.3
30、代理模式的结构和参与者n对象(对象(Subject)定义ConcreteSubject和Proxy的共用接口,这样就在任何使用ConcreteSubject的地方都可以使用Proxy。n具体对象(具体对象(ConcreteSubject)定义Proxy所代表的实体6.6.4 应用举例n生活中的例子生活中的例子n代理模式提供一个中介以控制对这个对象的访问。一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。6.6.4 应用举例 在软件系统中,我们无时不在跨越障碍,当我们访问网络上一台计算机的资源时,我们正在跨越网络障碍,当我们去访问服务器上数据库时
31、,我们又在跨越数据库访问障碍,同时还有网络障碍。跨越这些障碍有时候是非常复杂的,如果我们更多的去关注处理这些障碍问题,可能就会忽视了本来应该关注的业务逻辑问题,Proxy模式有助于我们去解决这些问题。我们以一个简单的数学计算程序为例,这个程序只负责进行简单的加减乘除运算:6.6.4 应用举例 public class Math public double Add(double x,double y) return x + y; public double Sub(double x,double y) return x - y; public double Mul(double x,double
32、 y) return x * y; public double Dev(double x,double y) return x / y; 6.6.4 应用举例如果说这个计算程序部署在我们本地计算机上,使用就非常之简单了,我们也就不用去考虑Proxy模式了。但现在问题是这个Math类并没有部署在我们本地,而是部署在一台服务器上,也就是说Math类根本和我们的客户程序不在同一个地址空间之内,我们现在要面对的是跨越Internet这样一个网络障碍: 6.6.4 应用举例n这时候调用Math类的方法就没有下面那么简单了,因为我们更多的还要去考虑网络的问题,对接收到的结果解包等一系列操作。 public
33、 class App public static void Main() Math math = new Math(); / 对接收到的结果数据进行解包 double addresult = math.Add(2,3); double subresult = math.Sub(2,3); double mulresult = math.Mul(2,3); double devresult = math.Dev(2,3); 6.6.4 应用举例n为了解决由于网络等障碍引起复杂性,就引出了Proxy模式,我们使用一个本地的代理来替Math类打点一切,即为我们的系统引入了一层间接层,示意图如下:n我
34、们在MathProxy中对实现Math数据类的访问,让MathProxy来代替网络上的Math类,这样我们看到MathProxy就好像是本地Math类,它与客户程序处在了同一地址空间内6.6.4 应用举例 public class MathProxy private Math math = new Math(); / 以下的方法中,可能不仅仅是简单的调用Math类的方法 public double Add(double x,double y) return math.Add(x,y); public double Sub(double x,double y) return math.Sub(x
35、,y); public double Mul(double x,double y) return math.Mul(x,y); public double Dev(double x,double y) return math.Dev(x,y); 6.6.4 应用举例n现在可以说我们已经实现了对Math类的代理,存在的一个问题是我们在MathProxy类中调用了原实现类Math的方法,但是Math并不一定实现了所有的方法,为了强迫Math类实现所有的方法,另一方面,为了我们更加透明的去操作对象,我们在Math类和MathProxy类的基础上加上一层抽象,即它们都实现与IMath接口,示意图如下:
36、 6.6.4 应用举例 public interface IMath double Add(double x,double y); double Sub(double x,double y); double Mul(double x,double y); double Dev(double x,double y); Math类和MathProxy类分别实现IMath接口: public class MathProxy : IMath / public class Math : IMath / 6.6.4 应用举例n此时我们在客户程序中就可以像使用Math类一样来使用MathProxy类了: p
37、ublic class App public static void Main() MathProxy proxy = new MathProxy(); double addresult = proxy.Add(2,3); double subresult = proxy.Sub(2,3); double mulresult = proxy.Mul(2,3); double devresult = proxy.Dev(2,3); 6.6.5 效果分析nProxy模式根据种类不同,效果也不尽相同:n1远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间
38、可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。n2虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。6.6
39、.5 效果分析n3Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。 n4保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。n5Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。 n6防火墙(Firewall)代理:保护目标,不让恶意用户接近。 n7同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
40、 n8智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。6.7 组合(Composite)模式一、组合模式的由来二、组合模式的意图及适用性三、组合模式的结构及参与者四、应用举例五、效果分析6.7.1 组合模式的由来表达部分与整体的树形结构机箱计算机显示器键盘鼠标主板CPU硬盘电源显卡网卡6.7.1 组合模式的由来抽象u 单一对象(Leaf):键盘、鼠标、显示器、硬盘、电源、 CPU、显卡、网卡u组合对象(Composite):计算机、机箱、主板u部件(Component):单一对象与组合对象的统称组合对象既可以包括单一对
41、象,也可以包括组合对象6.7.2 组合模式的意图及适用性意图将对象组合成树形结构表示“部分-整体”的层次结构。 Composite是的用户对单个对象和组合对象的使用具有一致性。以下情况可以使用组合模式表示对象的部分-整体层次结构忽略总体对象与单一对象的不同,用户将统一使用组合结构的所有对象6.7.3组合模式的结构及参与者6.7.3组合模式的结构及参与者6.7.3组合模式的结构及参与者Componentu为组合中的对象声明接口u在适当情况下实现所有类共有接口的缺省行为u声明一个接口用于访问和管理子组件Leafu叶节点对象,无子节点u定义叶节点对象的具体行为Compositeu定义组合对象的具体行为u存储子组件u实现Component中有关管理和维护子组件的接口Clientu通过Component的接口操纵组合部件的对象6.7.4 代码分析class Component public: Component(); virtual Component(); virtual void Operation() = 0; /定义所有组件的Operation接口 virtual void Add(const Component&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甘肃数学中考试题及答案
- 2025工业用地转让合同样本
- 翡翠鉴定师考试题及答案
- 方城物理中考试题及答案
- 多声部考试题目及答案
- 东平英语中考试题及答案
- 2025智能手机采购合同范本
- 电子维修必考试题及答案
- 中国起重机械件行业市场前景预测及投资价值评估分析报告
- 中国面包改良剂项目创业计划书
- 2025时政试题及答案(100题)
- 水稳层施工工艺流程与施工进度管理
- 幼儿乘坐高铁的安全指南
- 《数据中心铅酸蓄电池应用技术规程》
- 电力设备维护作业指导书
- 《数字故事培训》课件
- 中班科学教案可乐加盐
- 1.1 公有制为主体 多种所有制共同发展 课件-高中政治统编版必修二经济与社会
- 2024年新人教版五年级数学上册《教材练习9练习九》教学课件
- 晋升现实表现材料范文四篇
- 综测《中国近代史纲要》1-300 单选题附有答案
评论
0/150
提交评论