软件体系结构2讲解_第1页
软件体系结构2讲解_第2页
软件体系结构2讲解_第3页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、一、主程序 -子程序调用体系结构 组件:主程序 - 子程序 连接件:调用返回机制优点:(1)有效地将一个较复杂的程序系统设计分解成许多易于控制和处理的子任务,便于开 发和维护。(2)已被证明是成功的设计方法,可以被用于较大程序。缺点:(1)规模:程序超过 10 万行,表现不好;程序太大,开发太慢,测试越开越困难。(2)可重用性差、数据安全性差,难以开发大型软件和图形界面的应用软件。(3)把数据和处理数据的过程分离为相互独立的实体,当数据结构改变时,所有相关的 处理过程都要进行相应的修改。(4)图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也很困难。 我的程序:#include<

2、;iostream.h>using namespace stdint add(int x,int y); / 函数声明int main() / 主函数或主程序int a,b;cin>>a>>b;cout<<add(a,b)<<endl;int add(int x,int y) / 函数实现,或子函数return x+y;组件:主函数 main(), 子函数 swap()连接件: add(a,b)是对 add(x,y) 函数的调用 return(x+y) 是加法结果的实现二、面向对象体系结构组件 :类和对象连接件:对象之间通过功能与函数调用实

3、现交互 优点:(1)复用和维护:利用封装和聚合提高生产力 .因为对象对其他对象隐藏它的表示,所以 可以改变一个对象的表示,而不会影响其他的对象。某一组件的算法与数据结构的 修改不会影响其他组件,组件之间的依赖性降低,提高了复用度。(2)反映现实世界。( 3) 容易分解一个系统。缺点:(1)管理大量的对象:怎样确立大量对象的结构。(2)继承引起复杂度,关键系统中慎用。(3)必须知道对象的身份。(4) 不是特别适合功能的扩展,为了增加新的功能,要么修改已有的模块,要么加入新 的模块,从而影响性能。我的程序:public class Aprivate int x;public int XX(int

4、x)return x ;public class Bpublic int add(A d, int x)int y = d.XX(4);int z = y + x;return z;public class Programpublic static void main(String args) / TODO Auto-generated method stubA d = new A();B a=new B();double result = a.add(d, 4);组件:三个类 A B Program连接件: double result = a.add(d, 4);int y = d.XX(4

5、); 通过第一个语句实现两个数的加,但 是 add 中的两个参数一个是 A 的对象 d,在 add 函数内部,现调用了 d 的函数 XX 实现返回 原数运算,运算后的结果再与 4 相加,把相加的 result 结果返回。三、批处理体系结构组件:独立的应用程序 连接件:某种类型的媒介 优点 :把任务分解成一系列固定顺序的计算单元, 组件只通过数据传递交互, 每一步必须在前 一步结束后才能开始,数据必须是完整的,以整体的方式传递。 缺点:构件粒度大,延迟高,实时性差。1.无交互性,用户一旦提交作业就失去了对其运行的控制能力。 2.作业周转时间长,用户使用不方便。我的程序:程序 1 : 将一批数据以

6、二进制形式存放在磁盘文件中。#include <fstream>using namespace std;struct peoplechar name20;int age;char sex;int main( )people p3="Li",18,'f',"Fun",19,'m',"Wang",17,'f'ofstream outfile("peo.dat",ios:binary);if(!outfile) cerr<<"open er

7、ror!"<<endl; abort( );/ 退出程序for(int i=0;i<3;i+) outfile.write(char*)&pi,sizeof(pi); outfile.close( );return 0;程序 2 :将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。#include <fstream> using namespace std; struct peoplestring name;int age;char sex;int main( )people p3;int i;ifstream infile(&q

8、uot;peo.dat",ios:binary);if(!infile)cerr<<"open error!"<<endl;abort( );for(i=0;i<3;i+) infile.read(char*)&pi,sizeof(studi);infile.close( );for(i=0;i<3;i+)cout<<"NO."<<i+1<<endl; cout<<"name:"<<<<endl;

9、cout<<"age:"<<pi.age<<endl; cout<<"sex:"<<pi.sex<<endl<<endl;return 0;组件:程序 1 和程序 2连接件:文件 peo.dat四、管道 -过滤器体系结构组件:过滤器连接件:管道优点:(1) 使得系统中的构件具有良好的隐蔽性和高内聚、低耦合的特点。支持软件复用,允许 设计者将整个系统的输入 / 输出行为看成是多个过滤器的行为的简单合成;只要提供适合在 两个过滤器之间传送的数据, 任何两个过滤器都可被连接起来

10、; 系统维护和增强系统性能简 单:新的过滤器可以添加到现有系统中来,旧的可以被改进的过滤器替换掉;(2) 允许对一些如吞吐量、死锁等属性的分析;(3) 支持并行执行: 每个过滤器是作为一个单独的任务完成, 因此可与其它任务并行执行。 缺点:(1) 通常导致进程成为批处理的结构(2) 不适合处理交互的应用(3) 因为在数据传输上没有通用的标准,每个过滤器都增加了解析和合成数据的工作,这 样就导致了系统性能下降,并增加了编写过滤器的复杂性。我的程序:public class TestPipedpublic static void main(String args)sender s = new se

11、nder(); receiver r = new receiver(); PipedOutputStream out = s.getOut(); PipedInputStream in = r.getIn(); tryin.connect(out);s.start();r.start();catch(Exception e)e.printStackTrace();class sender extends Thread PipedOutputStream out = new PipedOutputStream(); public PipedOutputStream getOut()return

12、out;public void run() String str = "发送 "try out.write(str.getBytes(); out.close(); catch(Exception e) e.printStackTrace();class receiver extends Thread PipedInputStream in = new PipedInputStream();public PipedInputStream getIn() return in;public void run()byte buf = new byte1024;try int le

13、n = in.read(buf);从发送得到 "+new String(buf,0,len); in.close();catch(Exception e) e.printStackTrace();组件: sender receiver 连接件:PipedOutputStream out = s.getOut();PipedInputStream in = r.getIn();in.connect(out);五基于事件的隐式调用体系结构(1)组件是什么?连接件是什么?优点,缺点分别是什么? (2)编程实现一个基于事件的隐式调用体系结构的软件(功能不限,语言不限),并说明 程序中的组件和

14、连接件。答:(1) 组件: 对象或过程,并分类为以下更小的构件过程或函数,充当事件源或事件处理器的角色事件连接件: 事件过程绑定 事件事件绑定:在某些情况下,一个事件也可能触发其他事件,形成事件 链优点:1 为软件复用提供了强大的支持,功能扩展比较容易2 为系统动态演化带来了方便3 健壮性:一个构件出错将不会影响其他构件。4 支持实现交互式系统(用户输入 / 网络通讯)5 异步执行,不必同步等待执行结果6 对事件的并发处理将提高系统性能 缺点:1 分布式的控制方式使得系统的同步、验证和调试变得异常困难: 组件放弃了对系统计算的控制,难以控制各模块之间的处理次序 关于正确性的推理难以保证传统的基

15、于先验和后验条件的验证变得不可能2 数据交换的问题: 数据可通过事件直接在系统间传递(无调度模块时 ),但在具有独立调度模块的事件系统中, 数据则需要经过调度模块的传递。 在这些情况下, 全局性能和资源管理成为了系统 的瓶颈3 使用更多的存储空间 我的程序:public class button extendsActivity implements OnClickListener private Button button;protectedvoid onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);t

16、his);public void onClick(View v) switch (v.getId() caseToast.makeText(ButtonActivity. this, " 调用了隐式 ", Toast.LENGTH_SHORT ).show(); break;default:Toast.makeText(ButtonActivity. this, " 没有调用 ", Toast.LENGTH_SHORT ).show(); break;参考别人的 android 自己稍微修改 以上程序的组件:Button buttononClickVie

17、w以上程序的连接件:implements OnClickListenerbutton.setOnClickListener(this); 靠点击事件的调用六 层次体系结构组件:各层次内部包含的构件 连接件:层间的交互协议优点: (1)支持基于抽象程度递增的系统设计,有利于设计者对一个复杂系统进行分解; (2)局部依赖性,因为每一层至多和相邻的上下层交互,因此功能的改变通常影响相邻的 上下层;(3)可复用性, 如果某独立层保证了功能的完整性并且提供了文档化的接口,便可在 多个语境中复用。(4)可替换性,只要提供的服务接口定义不变,同一层的不同实现可以交换使用。这样, 就可以定义一组标准的接口,而

18、允许各种不同的实现方法。(5)对标准化的支持。清晰定义并且广泛接受的抽象层次能够促进实现标准化的任务和接 口开发,同样接口的不同实现能够互换使用。(6)可测试性。 具有定义明确的层接口以及交换层接口的各个实现的能力提高了可测试性。 缺点:(1)并不是每个系统都可以很容易地划分为分层的模式,甚至即使一个系统的逻辑结构是 层次化的,出于对系统性能的考虑,系统设计师不得不把一些低级或高级的功能综合起来; (2)效率的降低(3)很难找到合适的、正确的层次抽象方法我的程序:Servlet:BuyServlet:http.HttpServlet;import javax.servlet.http.Http

19、ServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class BuyServlet extends HttpServlet HttpServletResponse response) throwsprotected void doGet(HttpServletRequest request,ServletException, IOException doPost(request,response);protected void doP

20、ost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException String action=request.getParameter("action"); / 获取 action 参数值if(action=null)action=""if(action.equals("buy") buy(request,response);买if(action.equals("remove") re

21、move(request,response); 的移除if(action.equals("clear") clear(request,response);/ 实现购买商品的方法/ 触发了“购买”请求/ 调用 buy() 方法实现商品的购/ 触发了“移除”请求/ 调用 remove() 方法实现商品/ 触发了“清空购物车”请求/ 调用 clear()方法实现购物车的清空protected void buy(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOE

22、xception HttpSession session=request.getSession();String strId=request.getParameter("id");/ 获取触发 “购买” 请求时传递的 id参数,该参数存储的是商品在 goodslist 对象中存储的位置int id=MyTools.strToint(strId);ArrayList goodslist=(ArrayList)session.getAttribute("goodslist");GoodsSingle single=(GoodsSingle)goodslist

23、.get(id);ArrayList buylist=(ArrayList)session.getAttribute("buylist"); / 从 session 范围内获 取存储了用户已购买商品的集合对象if(buylist=null)buylist=new ArrayList();/ 将 buylist 对象赋值给 ShopCar/ 调用 ShopCar 类中 addItem()/ 将请求重定向到 show.jsp 页面ShopCar myCar=new ShopCar(); myCar.setBuylist(buylist);类实例中的属性myCar.addItem

24、(single);方法实现商品添加操作session.setAttribute("buylist",buylist);response.sendRedirect("show.jsp");/getServletConfig().getServletContext().getRequestDispatcher("/show.jsp").forward(request,response);/ 相当于 jsp:forward 内部跳转 , 与重定向有区别, request 对象仍保持/ 实现移除商品的方法protected void remo

25、ve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException HttpSession session=request.getSession();ArrayList buylist=(ArrayList)session.getAttribute("buylist");String name=request.getParameter("name");ShopCar myCar=new ShopCar();myCar.setBu

26、ylist(buylist); / 将 buylist 对象赋值给 ShopCar 类实例中的属性myCar.removeItem(MyTools.toChinese(name);/ 调用 ShopCar 类中 removeItem()方法实现商品移除操作response.sendRedirect("shopcar.jsp");/ 实现清空购物车的方法protected void clear(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOExcepti

27、on HttpSession session=request.getSession();ArrayList buylist=(ArrayList)session.getAttribute("buylist"); / 从 session 范围 内获取存储了用户已购买商品的集合对象buylist.clear(); / 清 空 buylist 集合对象,实现购物车清空的操作response.sendRedirect("shopcar.jsp"); IndexServlet:import javax.servlet.http.HttpServlet;import

28、 javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class IndexServlet extends HttpServlet private static ArrayList goodslist=new ArrayList();protected void doGet(HttpServletRequest request, HttpServletResponse response) t

29、hrows ServletException, IOException doPost(request,response);protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException HttpSession session=request.getSession(); session.setAttribute("goodslist",goodslist); response.sendRedirect(&qu

30、ot;show.jsp");static / 静态代码块String names="苹果","香蕉","梨","橘子 "float prices=2.8f,3.1f,2.5f,2.3f;for(int i=0;i<4;i+)GoodsSingle single=new GoodsSingle();single.setName(namesi);single.setPrice(pricesi);single.setNum(1);goodslist.add(single);ShopCar:public c

31、lass ShopCar private ArrayList buylist=new ArrayList(); / 用 来 存储购买的商品public void setBuylist(ArrayList buylist) this.buylist = buylist;/* 功能 向购物车中添加商品* 参数 single 为 GoodsSingle 类对象,封装了要添加的商品信息*/ public void addItem(GoodsSingle single) if(single!=null)if(buylist.size()=0) / 如 果 buylist 中不存在任何商品GoodsSin

32、gle temp=new GoodsSingle(); temp.setName(single.getName(); temp.setPrice(single.getPrice(); temp.setNum(single.getNum();buylist.add(temp); / 存储商品else / 如果 buylist 中存在商品int i=0;for(;i<buylist.size();i+) / 遍 历 buylist 集合对象,判断该集合中是否已经存在当前要添加的商品GoodsSingle temp=(GoodsSingle)buylist.get(i);/ 获 取buylis

33、t 集合中当前元素if(temp.getName().equals(single.getName()/ 判 断从 buylist 集合中获取的当前商品的名称是否与要添加的商品的名称相同/ 如果相同,说明已经购买了该商品, 只需要将商品的购买数量 加1temp.setNum(temp.getNum()+1); / 将商品购买数量加 1break;/ 结束 for 循环if(i>=buylist.size() / 说 明 buylist 中不存在要添加的商品GoodsSingle temp=new GoodsSingle(); temp.setName(single.getName(); t

34、emp.setPrice(single.getPrice(); temp.setNum(single.getNum();buylist.add(temp); /存储商品/* 功能 从购物车中移除指定名称的商品* 参数 name 表示商品名称*/public void removeItem(String name)for(int i=0;i<buylist.size();i+) 找指定名称的商品GoodsSingle temp=(GoodsSingle)buylist.get(i); 置的商品if(temp.getName().equals(name)name 参数指定的名称if(temp

35、.getNum()>1) 买数量大于 1temp.setNum(temp.getNum()-1); 减1break;环else if(temp.getNum()=1) 买数量为 1buylist.remove(i); 对象中移除该商品实体类: GoodsSingle :public class GoodsSingle private String name; private float price; private int num;/ 保存商品名称/ 保存商品价格/ 保存商品购买数量public String getName() return name;public void setNa

36、me(String name) = name;public int getNum() / 遍历 buylist 集合,查/ 获取集合中当前位/ 如果商品的名称为/ 如 果 商 品 的 购/ 则将 购买数 量/ 结束 for 循/ 如 果 商 品 的 购/ 从 buylist 集合return num; public void setNum(int num) this.num = num; public float getPrice() return price; public void setPrice(float price) this.price = price;Ind

37、ex.jsp:<% page contentType="text/html;charset=gb2312"%> <jsp:forward page="/index"/>Shopcar.jsp:<% page contentType="text/html;charset=gb2312"%> <% %><% %> <%/ 获取存储在 session 中用来存储用户已购买商品的 buylist 集合对象 ArrayList buylist=(ArrayList)session

38、.getAttribute("buylist"); float total=0; / 用来存储应付金额 %> <table border="1" width="450" rules="none" cellspacing="0" cellpadding="0"><tr height="50"><td colspan="5" align="center"> 购买的商品如下 <

39、;/td></tr> <tr align="center" height="30" bgcolor="lightgrey"><td width="25%"> 名称 </td><td>价格 (元/斤)</td><td>数量 </td><td>总价 (元)</td><td>移除 (-1/ 次)</td></tr><% if(buylist=null|bu

40、ylist.size()=0) %><tr height="100"><td colspan="5" align="center"> 您的购物车为空! </td></tr> <% elsefor(int i=0;i<buylist.size();i+)/ 获取商品名称/ 获取商品价格/ 获取购买数量GoodsSingle single=(GoodsSingle)buylist.get(i);String name=single.getName(); float pric

41、e=single.getPrice(); int num=single.getNum();/ 计算当前商品总价,并进行四舍五入 float money=(int)(price*num+0.05f)*10)/10f;total+=money; / 计算应付金额%><tr align="center" height="50"><td><%=name%></td><td><%=price%></td><td><%=num%></td>&

42、lt;td><%=money%></td><td><a href="doCar?action=remove&name=<%=single.getName() %>"> 移除 </a></td> </tr><%><tr height="50" align="center"><td colspan="5"> 应付金额: <%=total%></td>&

43、lt;/tr><tr height="50" align="center"><td colspan="2"><a href="show.jsp"> 继续购物 </a></td><td colspan="3"><a href="doCar?action=clear"> 清空购物车 </a></td></tr></table>Show.jsp:

44、<% page contentType="text/html;charset=gb2312"%><% %><% %><% ArrayList goodslist=(ArrayList)session.getAttribute("goodslist"); %><table border="1" width="450" rules="none" cellspacing="0" cellpadding="0"

45、><tr height="50"><td colspan="3" align="center"> 提供商品如下 </td></tr><tr align="center" height="30" bgcolor="lightgrey"><td>名称 </td><td>价格 (元/斤)</td><td>购买 </td></tr>&l

46、t;% if(goodslist=null|goodslist.size()=0) %><tr height="100"><td colspan="3" align="center"> 没有商品可显示! </td></tr><%elsefor(int i=0;i<goodslist.size();i+)GoodsSingle single=(GoodsSingle)goodslist.get(i);%><tr height="50" al

47、ign="center"><td><%=single.getName()%></td><td><%=single.getPrice()%></td><td><a href="doCar?action=buy&id=<%=i%>"> 购买 </a></td></tr><%><tr height="50"><td align="center&q

48、uot; colspan="3"><a href="shopcar.jsp"> 查看购物车 </a></td> </tr></table> 这是我上次写的程序在层次上又体现吧 组件:界面显示层( jsp 界面)逻辑控制层( BuyServlet ShopCar)数据层( IndexServlet)配 置层( web.xml )实体层( GoodsSingle)连接件: index.jsp 通过 <jsp:forward page="/index"/> 先是初

49、始化数据通过 IndexServlet 进行初 始化,然后 IndexServlet 转到 show.jsp 运用 response.sendRedirect("show.jsp"); 方法,进行购 买,你可以点击查看进入 showcar.jsp 进行查看购买的东西,也可以清空购物车,这些都是 session 的运用七 C/S体系结构(1)组件是什么?连接件是什么?优点,缺点分别是什么? (2)编程实现一个 C/S 体系结构的软件(功能不限,语言不限),并说明程序中的组件和 连接件。答:(1)组件:1 数据库服务器:存放数据的数据库、负责数据处理的业务逻辑2 客户机应用程序

50、: GUI:用户界面 业务逻辑:利用客户机上的应用程序对数据进行处理连接件:经由网络的调用 -返回机制或隐式调用机制客户机 服务器:客户机向服务器发送请求,并接收返回结果 优点 :1 具有强大的数据操作和事务处理能力,模型思想简单,易于人们理解和接受2 对于硬件和软件的变化显示出极大的适应性和灵活性,而且易于对系统进行扩充和 缩小3 系统中的功能组件充分隔离。将大的应用处理任务分布到许多通过网络连接的低成 本计算机上,以节约大量费用缺点:1互操作性差: 使用 DBMS所提供的私有的数据编程语言来开发业务逻辑, 降低了 DBMS 选择的灵活性 导致:软件移植困难,新技术无法轻易使用2 系统管理与

51、配置成本高:当系统升级时,每个客户端都需要随之改变 导致:维 护和升级困难3 系统伸缩性差:当用户数超过 100 ,性能急剧恶化4 开发成本较高,对客户端软硬件配置要求较高5 客户端程序设计复杂6 用户界面风格不一我的程序:服务端:package ;public class NioServer public static final int SERVERPORT=5555;public static final String USERNAME="wangzhirong"public static final String PASSWORD="123456"

52、;public static final String ISACK="ACK"public static final String ISNAK="NAK!"/ Selector selector;/ 选择器/ SelectionKey key;/key 。 一个 key 代表一个 Selector 在 NIO 通道上的注册 ,类似主键 ;/ / 取得这个 Key 后就可以对 Selector 在通道上进行操作private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 );/ 通道数据缓冲区publi

53、c NioServer()public static void main(String args) throws IOException NioServer ns=new NioServer();ns.BuildNioServer();public void BuildNioServer() throws IOException/ 先对服务端的 ServerSocket 进行注册 ,注册到 Selector /ServerSocketChannel ssc = ServerSocketChannel.open();/ 新建 NIO 通道 ssc.configureBlocking( false

54、 );/ 使通道为非阻塞ServerSocket ss = ssc.socket();/创建基于 NIO 通道的 socket 连接/ 新建 socket 通道的端口Selector selector=Selector.open();/ 获取一个选择器/ 将 NIO 通道选绑定到择器 ,当然绑定后分配的主键为 skeySelectionKey skey = ssc.register( selector, SelectionKey.OP_ACCEPT );/ 接收客户端的连接 Socket,并将此 Socket 也接连注册到 Selector /while(true)int num = sele

55、ctor.select();/ 获取通道内是否有选择器的关心事件if(num<1)continue; Set selectedKeys = selector.selectedKeys();/ 获取通道内关心事件的集合Iterator it = selectedKeys.iterator();while (it.hasNext() / 遍历每个事件trySelectionKey key = (SelectionKey)it.next();/ 有一个新联接接入事件 ,服务端事件if (key.readyOps() & SelectionKey.OP_ACCEPT)= Selectio

56、nKey.OP_ACCEPT) / 接收这个新连接ServerSocketChannel serverChanel = (ServerSocketChannel)key.channel(); / 从 serverSocketChannel 中创建出与客户端的连接 socketChannel SocketChannel sc = serverChanel.accept();sc.configureBlocking( false );/ Add the new connection to the selector/ 把新连接注册到选择器SelectionKey newKey = sc.regist

57、er( selector,SelectionKey.OP_READ );it.remove(););else/ 读客户端数据的事件 ,此时有客户端发数据过来 ,客户端事件if(key.readyOps() & SelectionKey.OP_READ)= SelectionKey.OP_READ)/ 读取数据SocketChannel sc = (SocketChannel)key.channel();int bytesEchoed = 0;while(bytesEchoed = sc.read(echoBuffer)> 0)echoBuffer.flip();byte cont

58、ent = new byteechoBuffer.limit();echoBuffer.get(content);String result=new String(content);doPost(result,sc);echoBuffer.clear();it.remove();catch(Exception e)public void doPost(String str,SocketChannel sc) boolean isok=false;int index=str.indexOf('|'); if(index>0)String name=str.substring

59、(0,index);String pswd=str.substring(index+1); if(pswd=null)pswd="" if(name!=null)if(name.equals(USERNAME)&& pswd.equals(PASSWORD) isok=true;else isok=false;else isok=false;else isok=false;String result=""if(isok) result="ACK"elseresult="NAK!"ByteBuffer bb = ByteBuffer.allocate( result.length() ); bb.put(result.getBytes();bb.flip();try sc.write(bb); catch (IOException e) e.printStackTrace();bb.clear();客户端:public class UserClient implements ActionListenerJFrame jf;JP

温馨提示

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

评论

0/150

提交评论