软件工程概述及设计模式PPT课件.ppt_第1页
软件工程概述及设计模式PPT课件.ppt_第2页
软件工程概述及设计模式PPT课件.ppt_第3页
软件工程概述及设计模式PPT课件.ppt_第4页
软件工程概述及设计模式PPT课件.ppt_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录,2020/8/12,1,1 OO概述,面向对象分析(OOA) 做什么? 从问题域中获取需要的类和对象,以及它们之间的关系。 面向对象设计(OOD) 怎么做? 面向对象编程(OOP) Do it,2020/8/12,2,1 OO概述,老张开车去东北。 请用OO思想进行分析(OOA)和设计(OOD),体现OO三大特性 封装类(名词):,2020/8/12,3,1 OO概述,老张开车去东北。 请用OO思想进行分析(OOA)和设计(OOD)。 封装类(名词):,2020/8/12,4,1 OO概述,老张开车去东北。 封装 创建成员方法。,2020/8/12,5,1 OO概述,老张开车去东北。 获

2、取属性,完善成员方法。,2020/8/12,6,1 OO概述,老张开车去东北。 封装:作用? 隐藏信息,降低类间耦合性。,2020/8/12,7,1 OO概述,老张开车去东北。 初始设计,2020/8/12,8,1 OO概述,public class Driver private String driverName; public String getName() return driverName; public void drive(Car car) car.go(new Address(东北); ,2020/8/12,9,1 OO概述,public class Car public vo

3、id go(Address dest) System.out.println(一路哼着歌,冒着烟,去了 + dest.getName(); ,2020/8/12,10,1 OO概述,public class Address private String addressName; public String getName() return addressName ; public void setName(String name) addressName = name; ,2020/8/12,11,1 OO概述,老张开车去东北。 设计优化:继承和多态 在某个粒度视图层面上对同类事物不加区别的对

4、待而统一处理,2020/8/12,12,1 OO概述,public class Driver private String driverName; public String getName() return driverName; public void setName(String name) driverName = name; /Vihecle vihecle = new Car(); public void drive(Vihecle vihecle) vihecle.go(new Address(东北); ,2020/8/12,13,1 OO概述,public abstract c

5、lass Vihecle public abstract void go(Address dest); public class Car extends Vihecle public void go(Address dest) System.out.println(一路哼着歌,冒着烟,去了 + dest.getName(); public class Plane extends Vihecle public void go(Address dest) System.out.println(“一路驾着云彩去了 + dest.getName(); ,2020/8/12,14,1 OO概述,publ

6、ic class Address private String addressName; public Address(String name) addressName = name; public String getName() return addressName ; public void setName(String name) addressName = name; ,2020/8/12,15,1 OO概述,public class Client public static void main(String args) Driver d = new Driver(); d.setN

7、ame(老张); /d.drive(new Plane(); d.drive(new Car(); 有什么缺陷?,2020/8/12,16,1 OO概述,持续优化:添加而不修改,系统扩展性强! 重载,2020/8/12,17,2 面向接口编程,面试题: 1.抽象类可以有构造方法,接口不可以. 2.抽象类中可以有普通成员变量,普通方法.接口不可以. 3.抽象类中的抽象方法的访问类型不能是private访问类型,但接口的抽象方法只能是public. 4.抽象类可以包含静态方法,但接口不可以. 5. 抽象类中静态成员变量的访问类型可以任意.但接口只能是 Public(static)final类型.

8、6.一个类可以实现多个接口,但只能继承一个抽象类.,1 abstract class和interface有什么区别?,2020/8/12,18,2 面向接口编程,设计层面: 抽象类是某种抽象事物(is a)。 接口是一组行为规范(like a)。 接口体现了 “如果你是则必须能”的理念 语法层面: 抽象类体现单继承关系; 接口可实现多继承。,2020/8/12,19,2 面向接口编程,2020/8/12,20,2 面向接口编程,面试题(扩展题): 2.1 接口是否可以继承接口? 2.2 接口是否可以继承抽象类? 2.3 抽象类是否可以实现接口? 2.4 抽象类是否可以继承具体类? 2.5 抽象

9、类中是否可以有静态的main方法? 抽象类与普通类的唯一区别就是不能创建实例对象和允许有 abstrct方法!,2020/8/12,21,2 面向接口编程,面向接口编程: 在系统分析和架构中,分清层次和依赖关系,下层不是直接向 其上层提供服务:即不是直接实例化在上层中,而是通过定义 一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接 口依赖,而不依赖具体类。 系统层次间协作关系是系统设计的关键 ,小到不同类之间的通 信,大到各模块之间的交互 。 本质:面向抽象编程,定义与实现的分离。,2020/8/12,22,2.1.1 设计模式四人帮,GoF(“四人帮”,又称Gang of Four,即

10、Erich Gamma, Richard Helm, Ralph Johnson abstract void Close(); ,2020/8/12,27,3.2 接口隔离原则(ISP),新需求: 需要门具有报警功能。 解决方案一:在抽象类(或接口)Door添加alarm方法。 abstract Door abstract void Open(); abstract void Close(); abstract void Alarm(); ,2020/8/12,28,3.2 接口隔离原则(ISP),问题? 违背ISP(接口隔离原则),Alarm方法对于依赖Door的模块是 多余的。 修改方案:

11、 abstact Door保留Open()、Close(),Alarm由子类扩展。 拆分成interface Door和interface Alarm接口。 拆分成abstact Door和interface Alarm。,2020/8/12,29,3.2 接口隔离原则(ISP),abstract Door abstract void Open(); abstract void Close(); Interface Alarmable void Alarm(); class AlarmDoor extends Door implents Alarmable ,2020/8/12,30,3.3

12、里氏替换原则(LSP),里氏替换原则(Liskov Substitution Principle) 定义:所有引用基类的地方必须能透明地使用其子类的对象。 通俗言之:任何父类出现的地方,子类一定可以出现。 在程序中尽量使用基类类型来对对象进行定义,而在运行时再 确定其子类类型,用子类对象来替换父类对象。 总结:子类可以扩展父类的功能,但不能改变父类原有的功能,2020/8/12,31,3.4 依赖倒置原则(DIP),依赖倒置原则(Dependence Inversion Principle ) 定义: 1、高层模块不应该依赖低层模块,两者都应该依赖于抽象(抽象类或接口)。 2、抽象(抽象类或接

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

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

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

16、ign pattern)是一套被反复使用、多数人知晓 的、经过分类编目的、代码设计经验的总结。 为何提倡设计模式? 根本原因是为了代码复用,增加可维护性 。 设计模式有助于对框架结构的理解,成熟的框架通常使用了多 种设计模式。 设计模式通过实现面向对象六大原则,从而达到了代码复用、 增加可维护性的目的。,2020/8/12,40,2.2.1 设计模式基本元素,模式名称 问题 解决方案 效果,2020/8/12,41,2.2.2 设计模式分类,设计模式分为三种类型,共23类。 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模 式、原型模式。 结构型模式:适配器模式、桥接模式、装饰模式、组合

17、模式、 外观模式、享元模式、代理模式。 行为型模式:模版方法模式、命令模式、迭代器模式、观察者 模式、中介者模式、备忘录模式、解释器模式、状态模式、策 略模式、职责链模式、访问者模式。,2020/8/12,42,2.3.1设计模式之单例模式(Singleton),单例设计模式的特点: 1.单例设计模式保证一个类只有一个实例; 2.要提供一个访问该类对象实例的全局访问点。 单例模式最重要的就是要保证一个类只有一个实例并且这个类 易于被访问。 一个全局类使得一个对象可以被访问,但是这样做却不能防止 你实例化多个对象。,2020/8/12,43,2.3.1 设计模式之单例模式(Singleton),

18、单例设计模式的实现: 1.为了避免其它程序过多的建立该类的对象,先禁止其它程序建 立该类对象实例(将构造器私有化)。 2.为了方便其它程序访问该类的对象,只好在本类中自定义一个 对象,由1可知该对象是static的,并对外提供访问方式。,2020/8/12,44,2.3.1 设计模式之单例模式(Singleton),单例模式具体实现有两种: 懒汉式 class Singleton private static Singleton instance=null; private Singleton() public static Singleton getInstance() if(instanc

19、e=null) instance=new Singleton(); return instance; ,2020/8/12,45,2.3.1 设计模式之单例模式(Singleton),饿汉式 class Singleton private static Singleton instance=new Singleton(); private Singleton() public static Singleton getInstance() return instance; ,2020/8/12,46,2.3.1 设计模式之单例模式(Singleton),饿汉式(总结) 对象预先加载,线程是安全的

20、,在类创建好的同时对象生成, 调用获得对象实例的方法反应速度快,代码简练。 懒汉式(总结) 对象延迟加载,效率高,只有在使用的时候才实例化对象,若 设计不当线程会不安全,代码相对于饿汉式复杂,第一次加 载类对象的时候反应不快。,2020/8/12,47,2.3.1 设计模式之多例模式(Multiton Pattern),class Multiton private static Multiton multi1=new Multiton(); private static Multiton multi2=new Multiton(); private Singleton() public sta

21、tic Singleton getInstance(int value) if(1=value) return multi1; else return multi2; /多例模式:单例模式的推广。,2020/8/12,48,2.3.1 设计模式之多例模式(Multiton Pattern),class Multiton private static List list = new ArraryList(); private static Multiton multi1=new Multiton(); private static Multiton multi2=new Multiton();

22、private static final int maxCount = 2;/最多的实例数 static list.add(multi1); list.add(multi2); private Singleton() public static Singleton getInstance(int value) return list.get(index); /多例模式:单例模式的推广。,2020/8/12,49,2.3.2 工厂模式(Factory),工厂模式在java与模式中分为三类: 简单工厂模式(静态工厂Simple Factory) 工厂方法模式(Factory Method) 抽象工

23、厂模式(Abstract Factory) GOF在设计模式一书中,将简单工厂模式看做特殊的工厂方 法模式。,2020/8/12,50,2.3.2 工厂模式(Factory),简单工厂模式(静态工厂Simple Factory) Creater(工厂角色):是简单工厂的核心。工厂角色可被外部直接 调用,创建所需产品对象。 Product(抽象产品角色):具体产品类的父类。 ConcreteProduct(具体产品类)。,2020/8/12,51,2.3.2 工厂模式(Factory),public class Creater /静态工厂模式 public static Dog CreateDo

24、g(String dogName)throws Exception if(carName.equalsIgnoreCase(“TaiDi) return new TaiDi(); else if(carName.equalsIgnoreCase(“MuYang) return new MuYang(); public abstract Dog public void run(); ,2020/8/12,52,2.3.2 工厂模式(Factory),public Taidi extends Dog public MuYang extends Dog ,2020/8/12,53,2.3.2 工厂模

25、式(Factory),public class Client public static void main(String args) /Dog dog= new TaiDi(); /Dog dog = new MuYang(); Dog dog = Creater.CreateDog(“TaiDi); ,2020/8/12,54,2.3.2 工厂模式(Factory),静态工厂在创建产品时,通常结合反射一起使用。 public class Creater /静态工厂模式 public static TaiDi CreateDog(String carName)throws Exception

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

27、public abstract class Factory Dog getInstance(); public class TaiDiFactory implements Factory public Dog getInstance() return new TaiDi (); public class MuYangFactory implements Factory public Dog getInstance() return new MuYang (); ,Creater,ConcreteCreater,ConcreteCreater,2020/8/12,57,2.3.2 工厂模式(Fa

28、ctory),public abstract class Dog public abstract void run(); public class TaiDi extends Dog public class MuYang extends Dog public void run() public void doAfraid()System.out.println(“我是MuYang我怕谁!”); ,Product,ConcreteProduct,ConcreteProduct,2020/8/12,58,2.3.2 工厂模式(Factory),public static void main(St

29、ring args) Factory factory = new TaiDiFatory(); Dog dog = factory. getInstance(); dog . run(); /dog.doAfraid(); 哪些情况使用工厂模式? 1) 当客户程序不需要知道要使用对象的创建过程。 2) 客户程序使用的对象存在变动的可能,或者根本就不知道使 用哪一个具体的对象。,2020/8/12,59,2.3.3 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定 它们具体的类。,2020/8/12,60,2.3.3 抽象工厂模式(Abst

30、ract Factory),1.AbstractFactory 声明一个创建抽象产品对象的操作接口。 2.ConcreteFactory 实现创建具体产品对象的操作。 3.AbstractProduct 为一类产品对象声明一个接口。 4.ConcreteProduct 定义一个将被相应的具体工厂创建的产品对象 ,实现AbstractProduct接口。 5.Client 仅使用由AbstractFactory和AbstractProduct类声明的接口,2020/8/12,61,2.3.3 抽象工厂模式(Abstract Factory),AbstractFactory: public int

31、erface AbstractFactory public Car CreateBmwCar(); public Car CreateBenzCar(); ,2020/8/12,62,2.3.3 抽象工厂模式(Abstract Factory),ConcreteFactory: class ConcreteSportFactory implents AbstractFactory public Car CreateSportBmwCar() return new BmwSportsCar(); public ISporting CreateSportBenzCar() return new B

32、enzSportsCar(); ,2020/8/12,63,2.3.3 抽象工厂模式(Abstract Factory),AbstractProduct: public abstract Car void go(); ,2020/8/12,64,2.3.3 抽象工厂模式(Abstract Factory),ConcretePorduct: public class BmwSportsCar extend Car public void go() System.out.println( BmwSportsCar run!); public class BenzSportsCar extend C

33、ar public void go() System.out.println( BenzSportsCar run!); ,2020/8/12,65,2.3.3 抽象工厂模式(Abstract Factory),Client: public static void main(String args) AbstractFactory sportCarFactory = new ConcreteSportFactory (); Car car = sportCarFactory . CreateSportBmwCar(); /Car car = sportCarFactory . CreateSp

34、ortBenzCar(); 能不能把增加产品家族数量?,2020/8/12,66,2.3.4 外观模式(Facade),Facade模式,2020/8/12,67,2.3.4 外观模式(Facade),Facade模式: 1 定义了一个更高的接口,使子系统更加容易使用; 2 为子系统中的一组接口提供一个统一的接口。,2020/8/12,68,2.3.4 外观模式(Facade),Eg:开关电脑模拟程序(见开关电脑模拟程序文档),2020/8/12,69,2.3.4 外观模式(Facade),核心思想:封装交互,简化调用(化繁为简)! 作用: 外部减少与子系统内多个模块的交互,松散耦合; 让外部

35、能够更简单的使用子系统; 大大节省学习时间。,2020/8/12,70,2.3.5 适配器模式(Adapter),Adapter模式(结构型) 1 将一个类的接口转换成客户希望的另外一个接口; 2 使得原本由于接口不兼容而不能一起工作的那些类可以一起 工作。 Eg1 :电源适配器,2020/8/12,71,2.3.5 适配器模式(Adapter),Eg2:android email显示 一个ListView的使用涉及了两个部 分,一个是数据源DataSource, 另外一个是数据源的各项的布局 显示ItemLayout。DataSource是不 能直接展示在用户面前,ItemLay out才是

36、直接用户,DataSource向 ItemLayout填充和转换就是一个典 型的适配过程,就需要一个适配器对象来参与其中。,2020/8/12,72,2.3.5 适配器模式(Adapter),示例程序(见Adapter-获取电压程序),2020/8/12,73,2.3.5 适配器模式(Adapter),Adapter模式(结构型) 它不是为了解决还处在开发阶段的问题,而是解决正在服役的 项目问题。 解决接口不相容的问题:复用代码,不修改原有代码。 缺点: 对于对象适配器来说,更换适配器的实现过程比较复杂。 对象适配器和类适配器?,2020/8/12,74,2.3.6 职责链模式(COR),职责

37、链(Chain of Responsibility):行为型 发送方发送一个请求,使多个对象都有机会处理请求,从而避 免请求的发送者和接收者之间的耦合关系。 将这些对象连成一条链, 并沿着这条链传递该请求,直到有一 个对象处理它为止。 核心思想:给多个对象处理一个请求的机会,从而解耦发送者 和接受者 。,2020/8/12,75,2.3.6 职责链模式(COR),适用范围 1 有多个对象可以处理同一个请求 2 不能明确指定接收者,2020/8/12,76,2.3.6 职责链模式(COR),Eg1:公司请假 Eg2:brew平台消息机制 Eg3:java 异常处理,try catch(Excep

38、tion e1) catch(Exception e2) finally ,2020/8/12,77,2.3.6 职责链模式(COR),2020/8/12,78,2.3.7 观察者模式(Observer),观察者模式: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改 变时, 所有依赖于它的对象都得到通知并被自动更新。 观察者中涉及了两个对象,一个是观察目标,一个是观察者。 观察目标有典型的3个方法: 订阅,取消订阅,通知。 订阅: 增加状态或事件通知的对象 取消订阅: 删除状态或事件通知对象 通知: 通知所有订阅了状态和事件的对象。,2020/8/12,79,2.3.7 观察者模式(

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

40、ediator),中介者模式: 1 用一个中介对象来封装一系列的对象交互; 2 中介者使各对象不需要显式地相互引用,从而使其耦合松散, 而且可以独立地改变它们之间的交互。 Eg:android-Activity与Intent Demo程序:Mediator模式-居委会大妈,2020/8/12,82,2.3.8 中介者模式(Mediator),2020/8/12,83,2.3.8 中介者模式(Mediator),2020/8/12,84,2.3.8 中介者模式(Mediator),中介者模式本质: 封装交互 何时选用中介者模式 1 如果一组对象之间的通信方式比较复杂,导致相互依赖、结构 混乱;

41、2 如果一个对象引用很多的对象,并直接跟这些对象交互,导 致难以复用该对象 。,2020/8/12,85,2.3.9 模式区别,外观模式和中介者模式 1 中介者模式主要用来封装多个对象之间相互的交互,多用在系 统内部的多个模块之间;而外观模式封装的是单向的交互 。 2 在中介者模式的实现里面,是需要实现具体的交互功能的;而 外观模式的实现里面,一般是组合调用或是转调内部实现的功 能,通常外观模式本身并不实现这些功能。,2020/8/12,86,2.3.9 模式区别,外观模式和单例模式 通常一个子系统只需要一个外观实例,所以外观模式可以和单 例模式组合使用,把Facade类实现成为单例 。,20

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

43、对象看上去就像是改变了它的类一样。 状态模式把所研究的对象的行为包装在不同的状态对象里,每 一个状态对象都属于一个抽象状态类的一个子类。状态模式的 意图是让一个对象在其内部状态改变的时候,其行为也随之改 变。,2020/8/12,89,2.3.10 状态模式,天气案例(疯狂设计模式),2020/8/12,90,2.3.11 桥接模式,桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 应用场景: 某个类具有两个或两个以上的维度变化,如果只是使用继承将 无法实现这种需要,或者使得设计变得相当臃肿。,2020/8/12,91,2.3.11 桥接模式,2020/8/12,92,2.3

44、.11 桥接模式,举例来说: 面馆供应牛肉面、猪肉面,而且顾客可根据自己的口味选择 是否添加辣椒。此时就产生了一个问题,我们如何来应对这种 变化:我们是否需要定义辣椒牛肉面、无辣牛肉面、辣椒猪肉 面、无辣猪肉面4个子类?如果餐厅还供应羊肉面、韭菜面呢 ?如果添加辣椒时可选择无辣、微辣、中辣、重辣风味呢? 那程序岂非一直忙于定义子类? 腾讯笔试题()设计模式将抽象部分与它的实现部分相分离。 A、Singleton(单例)B、Bridge(桥接) C、Composite(组合)D、 Facade(外观),2020/8/12,93,2.3.12 原型模式,2020/8/12,94,2.3.9 原型模式(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论