面向對象分析與設計第九章2_第1頁
面向對象分析與設計第九章2_第2頁
面向對象分析與設計第九章2_第3頁
面向對象分析與設計第九章2_第4頁
面向對象分析與設計第九章2_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、面向對象分析與設計29 設計模式q創(chuàng)建型模式:用于管理對象的創(chuàng)建qFactory Method qAbstract FactoryqSingleton qBuilderqPrototype qSimple Factory qObject Pool 39 設計模式q 行為型模式:用于封裝行為的變化q Interpreterq Template Method q Chain of Responsibilityq Commandq Iteratorq Mediatorq Mementoq Observerq Stateq Strategyq Visitor 49 設計模式q結構型模式:用于將以有的代

2、碼集成到新的面向對象設計中。qAdapterqBridgeqCompositeqDecoratorqFaadeqFlyweightqProxy 5qSingleton模式q意圖:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 q適用性:q當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。 q當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。 6q public class SingletonServer qprivate static SingletonServer ss_instance = null;qprivate Single

3、tonServer() qtry qVector v = new Vector();qv.addElement(服務器正在運行);qServerFrameTest.getList().setListData(v);q catch (Exception ee) qJOptionPane.showMessageDialog(null, 服務器已經(jīng)在運行!);qSystem.exit(-1);qqqsynchronized public static SingletonServer getInstance() q if (ss_instance = null) q ss_instance = new

4、 SingletonServer();q q JOptionPane.showMessageDialog(null, 服務器已經(jīng)啟動!);q return ss_instance;q q 7q public class SingletonServer q private static class Instance q static final SingletonServer ss_instance = new SingletonServer();q q private SingletonServer() q try q Vector v = new Vector();q v.addElemen

5、t(服務器正在運行);q ServerFrameTest.getList().setListData(v);q catch (Exception ee) q JOptionPane.showMessageDialog(null, 服務器已經(jīng)在運行!);q System.exit(-1);q q q public static SingletonServer getInstance() q ServerFrameTest.getStartButton().setEnabled(false);q return Instance.ss_instance;q q 8q這個方案之所以奏效,是因為內部類(

6、Instance)將只被裝載一次,所以只會創(chuàng)建一個SingletonServer對象。910第九章 設計模式 qJava簡單工廠創(chuàng)建性模式介紹q研究和使用創(chuàng)建性模式的必要性q面向對象的設計的目的之一,就是把責任進行劃分,以分派給不同的對象。我們推薦這種劃分責任的作法, 是因為它和封裝(Encapsulation)和分派(Delegation)的精神是相符合的。創(chuàng)建性模式把對象的創(chuàng)建過程封裝起來,使得創(chuàng)建實例的責任與使用實例的責任分割開, 并由專門的模塊分管實例的創(chuàng)建,而系統(tǒng)在宏觀上不再依賴于對象創(chuàng)建過程的細節(jié)。11q所有面向對象的語言都有固定的創(chuàng)建對象的辦法。java的辦法就是使用new操作符

7、。比如qStringBuffer s = new StringBuffer(1000);q就創(chuàng)立了一個對象s,其類型是StringBuffer。使用new操作符的短處是事先必須明確知道要實例化的類是什么, 而且實例化的責任往往與使用實例的責任不加區(qū)分。使用創(chuàng)建性模式將類實例化,首先不必事先知道每次是要實例化哪一個類, 其次把實例化的責任與使用實例的責任分割開來,可以彌補直接使用new操作符的短處。12q而工廠模式就是專門負責將大量有共同接口的類實例化,而且不必事先知道每次是要實例化哪一個類的模式。 q工廠模式有以下幾種形態(tài):q簡單工廠(Simple Factory)模式 q工廠方法(Facto

8、ry Method)模式,又稱多形性工廠(Polymorphic Factory)模式 q抽象工廠(Abstract Factory)模式,又稱工具箱(Kit或Toolkit)模式13q 簡單工廠模式q 比如說,你有一個描述你的后花園的系統(tǒng),在你的后花園里有各種的花,但還沒有水果。你現(xiàn)在要往你的系統(tǒng)里引進一些新的類,用來描述下列的水果: q 葡萄 Grapes q 草莓 Strawberryq 萍果萍果 Appleq 花和水果最大的不同花和水果最大的不同,就是水果最終是可以采摘食用的。就是水果最終是可以采摘食用的。那么那么,很自然的作法就是建立一個各種水果都適用的接口很自然的作法就是建立一個各

9、種水果都適用的接口,這樣一來這些水果類作為相似的數(shù)據(jù)類型就可以和你的系這樣一來這些水果類作為相似的數(shù)據(jù)類型就可以和你的系統(tǒng)的其余部分統(tǒng)的其余部分,如各種的花有所不同如各種的花有所不同,易于區(qū)分。易于區(qū)分。1415qpublic interface IFruit qpublic abstract void grow();q public abstract void harvest();q public abstract void plant(); q/代碼清單1. q接口IFruit的源代碼。這個接口確定了水果類必備的方法:種植plant(),生長grow(), 以及收獲harvest()。16

10、q public class Apple implements IFruitq private int treeAge;q public void grow()q log(Apple is growing.);q q public void harvest()q log(Apple has been harvested.);q q public void plant()q log(Apple has been planted.);q q public static void log(String msg) q System.out.println(msg);q q public int get

11、TreeAge()q return treeAge; q q public void setTreeAge(int treeAge)q this.treeAge = treeAge; q q /代碼清單2. 類Apple的源代碼。q /萍果是多年生木本植物,因此具備樹齡treeAge性質。17q public class Grape implements IFruitq private boolean seedful;q public void grow()q log(Grape is growing.);q q public void harvest()q log(Grape has bee

12、n harvested.);q q public void plant()q log(Grape has been planted.);q q public static void log(String msg)q System.out.println(msg);q q public boolean getSeedful()q return seedful;q q public void setSeedful(boolean seedful)q this.seedful = seedful;q /代碼清單3. 類Grape的源代碼。葡萄分為有籽與無籽兩種,因此具有q /seedful性質。18

13、qpublic class Strawberry implements IFruit qpublic void grow()qlog(Strawberry is growing.);qqpublic void harvest()qlog(Strawberry has been harvested.);qqpublic void plant()qlog(Strawberry has been planted.);qqpublic static void log(String msg)qSystem.out.println(msg);qq代碼清單4. 類Strawberry的源代碼。19q你作為小

14、花果園的主人兼園丁,也是系統(tǒng)的一部分,自然要由一個合適的類來代表,這個類就是 FruitFactory類。這個類的結構請見下面的UML類圖。 IFruitFruitFactory20qFruitFactory類會根據(jù)要求,創(chuàng)立出不同的水果類,比如萍果Apple,葡萄Grape或草莓Strawberry的實例。而如果接到不合法的要求,FruitFactory類會給出例外BadFruitException。 21q public class FruitFactorypublic IFruit factory(String which) throws BadFruitExceptionif (whi

15、ch.equalsIgnoreCase(apple)return new Apple();else if (which.equalsIgnoreCase(strawberry)return new Strawberry();else if (which.equalsIgnoreCase(grape)return new Grape();elsethrow new BadFruitException(Bad fruit request);代碼清單5. FruitFactory類的源代碼。 22qpublic class BadFruitException extends Exceptionpub

16、lic BadFruitException(String msg)super(msg);代碼清單6. BadFruitException類的源代碼。 23q在使用時,只須呼叫FruitFactory的factory()方法即可 try FruitFactory gardener = new FruitFactory();gardener.factory(grape);gardener.factory(apple);gardener.factory(strawberry);catch(BadFruitException e) 24q簡單工廠模式的定義簡單工廠模式的定義 q總而言之總而言之,簡單工

17、廠模式就是由一個工廠類根據(jù)參簡單工廠模式就是由一個工廠類根據(jù)參數(shù)來決定創(chuàng)立出那一種產品類的實例。下面的數(shù)來決定創(chuàng)立出那一種產品類的實例。下面的UML類圖就精確定義了簡單工廠模式的結構。類圖就精確定義了簡單工廠模式的結構。 25q public class CreatorFactoryq q public Product factory()q q return new ConcreteProduct();q q q public interface Productq q public abstract ConcreteProduct();q q public class ConcreteProd

18、uct implements Productq q public ConcreteProduct()q q /代碼清單7. 簡單工廠模式框架的源代碼。26q單工廠模式實際上就是我要在后面介紹的,工廠方法模式的一個簡化了的情形。在熟悉了簡單工廠模式后,就不難掌握工廠方法模式了。272829qpublic class computer qpublic static void main(String args) throws IOException qtryqBufferedReader br = new BufferedReader(new InputStreamReader(System.in)

19、;qString strA ;qString strB ;qString strO ;qSystem.out.print(請輸入數(shù)據(jù)A:);qstrA = br.readLine( );qSystem.out.print(請選擇運算符號(+、-、*、/):);qstrO= br.readLine();qSystem.out.print(請輸入數(shù)據(jù)B:);qstrB = br.readLine( );qString strResult = ;qOperation oper = null;qoper = OperationFactory.CreateOperate(strO);qoper.SetN

20、umberA(Double.valueOf(strA).doubleValue();qoper.SetNumberB(Double.valueOf(strB).doubleValue();qstrResult = Double.toString(oper.GetResult();qSystem.out.print(strResult);qqcatch(Exception e)qqqq30q Public abstract class Operation qprivate double numberA;qprivate double numberB;qpublic double GetNumbe

21、rA()qreturn numberA;qqpublic void SetNumberA(double a)qnumberA = a;qqpublic double GetNumberB()qreturn numberB;qqpublic void SetNumberB(double b)qnumberB = b;qqpublic abstract double GetResult()q 31q public class OperationFactory qpublic static Operation CreateOperate(String oper)qqOperation operate

22、 = null;qif(oper.equals(+)qoperate = new OperationAdd();qqif(oper.equals(-)qoperate = new OperationSub();qqreturn operate;qq 32qclass OperationAdd extends Operation qpublic double GetResult()qdouble result = 0;qresult = super.GetNumberA() + super.GetNumberB();qreturn result;qq33qclass OperationSub e

23、xtends Operation qpublic double GetResult()qdouble result= 0;qresult = super.GetNumberA() - super.GetNumberB();qreturn result;qq3435q public class computer qpublic static void main(String args) throws IOException q tryqBufferedReader br = new BufferedReader(new InputStreamReader(System.in);qString s

24、trA ;String strB ;String strO ;qSystem.out.print(請輸入數(shù)據(jù)A:);qstrA = br.readLine( );qSystem.out.print(請選擇運算符號(+、-、*、/):);qstrO= br.readLine();qSystem.out.print(請輸入數(shù)據(jù)B:);qstrB = br.readLine( );qString strResult = ;qOperation oper = null;qIFactory operFactory = null ;qif(strO.equals(+)qoperFactory= new A

25、ddFactory();qqif(strO.equals(-)qoperFactory = new SubFactory();qqoper = operFactory.createOperation();36q oper.SetNumberA(Double.valueOf(strA).doubleValue(); oper.SetNumberB(Double.valueOf(strB).doubleValue(); q strResult = Double.toString(oper.GetResult();qSystem.out.print(strResult);qq catch(Excep

26、tion e)qqq 37q public abstract class Operation qprivate double numberA;qprivate double numberB;qpublic double GetNumberA()qreturn numberA;qqpublic void SetNumberA(double a)qnumberA = a;qqpublic double GetNumberB()qreturn numberB;qqpublic void SetNumberB(double b)qnumberB = b;qqpublic abstract double

27、 GetResult();q 38qpublic interface IFactory qpublic abstract Operation createOperation();qqpublic class AddFactory implements IFactory qpublic Operation createOperation() qreturn new OperationAdd();qq39qpublic class SubFactory implements IFactory qpublic Operation createOperation() qreturn new Opera

28、tionSub();qq40q class OperationAdd extends Operation qpublic double GetResult()qqdouble result = 0;qresult = super.GetNumberA() + super.GetNumberB();qreturn result;qq q class OperationSub extends Operation qpublic double GetResult()qqdouble result= 0;qresult = super.GetNumberA() - super.GetNumberB()

29、;qreturn result;qq 41q現(xiàn)在,讓我們繼續(xù)考察我們的小花果園。在一節(jié)里,我們在后花園里引進了水果類植物, 構造了簡單工廠模式來處理, 使用一個FruitFactory類來負責創(chuàng)立水果類的實例 .4243q我們準備再次引進蔬菜類植物,比如 西紅柿 (Tomato) 土豆 (Potato) 西芥蘭花 (Broccoli) q蔬菜與花和水果當然有共同點,可又有不同之處。蔬菜需要噴灑(dust)殺蟲劑(pesticide)除蟲, 不同的蔬菜需要噴灑不同的殺蟲劑,等等。怎么辦呢? 那么,再借用一下簡單工廠模式不就行了? 再設計一個專管蔬菜類植物的工廠類,比如 4445q這樣做一個明顯的

30、不足點就是不夠一般化和抽象化。在FruitFactory和VeggieGardener類之間明顯存在很多共同點, 這些共同點應當抽出來一般化和框架化。這樣一來,如果后花園的主人決定再在園子里引進些樹木類植物時, 我們有框架化的處理方法。本節(jié)所要引入的工廠方法模式就符合這樣的要求。 46q 簡單工廠模式涉及到以下的角色 q 工廠類工廠類 (Creator):擔任這個角色的是工廠方法模式的核心,是與應用程序程序緊密相關的,直接在應用程序調用下,創(chuàng)立產品實例的那個類。q 工廠類只有一個,而且是實的。q 產品產品 (Product):擔任這個角色的類是工廠方法模式所創(chuàng)立的對象的父類,或它們共同擁有的接

31、口。q 具體產品具體產品 (Concrete Product) :擔任這個角色的類是工廠方法模式所創(chuàng)立的具體對象所屬的類。 47q工廠方法模式的定義工廠方法模式的定義 48q 從圖可以看出,工廠方法模式涉及到以下的角色 q 抽象工廠接口抽象工廠接口(Creator) 擔任這個角色的是工廠方法模式的核心,它是與應用程序程序無關的。任何在模式中創(chuàng)立對象的工廠類必須實現(xiàn)這個接口。 q 具體工廠類具體工廠類 (Conrete Creator) 擔任這個角色的是與應用程序緊密相關的,直接在應用程序調用下,創(chuàng)立產品實例的那樣一些類。q 產品產品 (Product) 擔任這個角色的類是工廠方法模式所創(chuàng)立的對

32、象的父類,或它們共同擁有的接口。 49q具體產品具體產品 (Concrete Product) 擔任這個角色的類是工廠方法模式所創(chuàng)立的對象所屬的類。q工廠方法模式的核心是一個抽象工廠類,而不像簡單工廠模式, 把核心放在一個實類上。工廠方法模式可以允許很多實的工廠類從抽象工廠類繼承下來, 從而可以在實際上成為多個簡單工廠模式的綜合,從而推廣了簡單工廠模式。 50q反過來講,簡單工廠模式是由工廠方法模式退化而來。設想如果我們非常確定一個系統(tǒng)只需要一個實的工廠類, 那么就不妨把抽象工廠類合并到實的工廠類中去。而這樣一來,我們就退化到簡單工廠模式了。q與簡單工廠模式中的情形一樣的是,ConcreteC

33、reator 的factory() 方法返還的數(shù)據(jù)類型是一個接口 PlantIF,而不是哪一個具體的產品類。這種設計設計使得工廠類創(chuàng)立哪一個產品類的實例細節(jié)完全封裝在工廠類內部。 51q好了,現(xiàn)在讓我們回到小花果園的系統(tǒng)里,看一看怎樣發(fā)揮工廠方法模式的威力,解決需要接連不斷向小花果園引進不同類別的植物所帶來的問題。 首先,我們需要一個抽象工廠類,比如叫做 Gardener,作為兩個實工廠類 FruitGardener 及 VeggieGardener 的父類。 Gardener 的 factory() 方法可以是抽象的,留給子類去實現(xiàn),也可以是實的,在父類實現(xiàn)一部分功能,再在子類實現(xiàn)剩余的功能

34、。我們選擇將 factory() 做成抽象的,主要是因為我們的系統(tǒng)是一個示范系統(tǒng),內容十分簡單,沒有要在父類實現(xiàn)的任何功能。 5253q抽象工廠類 Gardener 是工廠方法模式的核心,但是它并不掌握水果類或蔬菜類的生殺大權。相反地,這項權力被交給子類,即 VeggieGardener 及 FruitGardener。 abstract public class Gardenerpublic abstract PlantIF factory(String which) throws BadFruitException; 54q public class VeggieGardener exte

35、nds Gardenerpublic PlantIF factory(String which) throws BadPlantExceptionif (which.equalsIgnoreCase(tomato)return new Tomato();else if (which.equalsIgnoreCase(potato)return new Potato();else if (which.equalsIgnoreCase(broccoli)return new Broccoli();elsethrow new BadPlantException(Bad veggie request)

36、; 55q public class FruitGardener extends Gardenerpublic PlantIF factory(String which)if (which.equalsIgnoreCase(apple)return new Apple();else if (which.equalsIgnoreCase(strawberry)return new Strawberry();else if (which.equalsIgnoreCase(grape)return new Grape();elsethrow new BadPlantException(Bad fru

37、it request); 56q public class Apple implements FruitIF, PlantIFpublic void grow()log(Apple is growing.);public void harvest()log(Apple has been harvested.);public void plant()log(Apple has been planted.);private static void log(String msg)System.out.println(msg);public int getTreeAge() return treeAg

38、e; public void setTreeAge(int treeAge) this.treeAge = treeAge; private int treeAge; 57q水果類 Apple。與一節(jié)里的Apple類相比,唯一的區(qū)別就是多實現(xiàn)了一個接口 PlantIF。其它的水果類與 Apple 相似,因此不再贅述。 58q工廠方法模式應該在什么情況下使用工廠方法模式應該在什么情況下使用q既然工廠方法模式與簡單工廠模式的區(qū)別很是微妙,那么應該在什么情況下使用工廠方法模式,又應該在什么情況下使用簡單工廠模式呢? q一般來說,如果你的系統(tǒng)不能事先確定那一個產品類在哪一個時刻被實例化,從而需要將實例

39、化的細節(jié)局域化,并封裝起來以分割實例化及使用實例的責任時,你就需要考慮使用某一種形式的工廠模式。 59q 在我們的小花果園系統(tǒng)里,我們必須假設水果的種類隨時都有可能變化。我們必須能夠在引入新的水果品種時,能夠很少改動程序程序,就可以適應變化以后的情況。因此,我們顯然需要某一種形式的工廠模式。q 如果在發(fā)現(xiàn)系統(tǒng)只用一個產品類等級(hierarchy)就可以描述所有已有的產品類,以及可預見的未來可能引進的產品類時,簡單工廠模式是很好的解決方案。因為一個單一產品類等級只需要一個單一的實的工廠類。 q 然而,當發(fā)現(xiàn)系統(tǒng)只用一個產品類等級不足以描述所有的產品類,包括以后可能要添加的新的產品類時,就應當考

40、慮采用工廠方法模式。由于工廠方法模式可以容許多個實的工廠類,以每一個工廠類負責每一個產品類等級,因此這種模式可以容納所有的產品等級 60q在我們的小花果園系統(tǒng)里,不只有水果種類的植物,而且有蔬菜種類的植物。換言之,存在不止一個產品類等級。而且產品類等級的數(shù)目也隨時都有可能變化。因此,簡單工廠模式不能滿足需要,為解決向題,我們顯然需要工廠方法模式。 61工資打印程序框架62q import java.io.BufferedReader;q import java.io.InputStreamReader;q public class ClientPrint qpublic static void

41、 main(String args) qtryqString stremp;qSystem.out.print(請輸入員工:);qBufferedReader br = new BufferedReader(new InputStreamReader(System.in);qstremp = br.readLine();qEmployee emp;qemp = EmployeeFactory.createEmployee(stremp);qemp.getSalary();qqcatch(Exception e)qqq 63q public class EmployeeFactory qpubl

42、ic static Employee createEmployee(String emp)qEmployee employee = null;qqif(emp.equalsIgnoreCase(Sales)qemployee = new Sales();qqif(emp.equalsIgnoreCase(Managers)qemployee = new Managers();qqif(emp.equalsIgnoreCase(Engineers)qemployee = new Engineers();qqreturn employee;qq 64qpublic abstract class E

43、mployee qpublic abstract void getSalary();qqpublic class Sales extends Employee qOverrideqpublic void getSalary() q/ TODO Auto-generated method stubqSystem.out.print(“Sales:底薪1500元,提成10%);qq65q public class Managers extends Employee qOverrideqpublic void getSalary() qSystem.out.print(Managers:年薪50萬元

44、!);qq q public class Engineers extends Employee qOverrideqpublic void getSalary() qSystem.out.print(Engineers:月薪5000元);qq 66Factory MethodqFactory Method模式是一個旨在幫助創(chuàng)建責任分配的模式。q意圖:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。q問題:一個類需要實例化另一個類的派生類,但不知道是哪一個。 Factory Method允許派生類進行抉擇。q解決方案:派生類對實例化

45、哪個類和如何實例化作出抉擇。67q在java中集合的iterator方法是工廠方法,這一方法返回被請求集合的迭代器的正確類型。q在C#中,集合實現(xiàn)了IEnumerable接口,這一接口定義了GetEnumerator方法,這是獲取集合迭代器的工廠方法。686970q public class ClientPrint qpublic static void main(String args) qtry qString stremp;qSystem.out.print(請輸入員工:);qBufferedReader br = new BufferedReader(new InputStreamRe

46、ader(System.in);qstremp = br.readLine();qEmployee emp = null;qClass cls = (Class) Class.forName(stremp + Factory);qIEmployeeFactory ief = cls.newInstance();emp = ief.CreateEmployee();qemp.getSalary();q catch (Exception e) q qq 71qpublic abstract class Employee q public abstract void getSalary();qqpu

47、blic interface IEmployeeFactory q public abstract Employee CreateEmployee();q7273q public class Engineers extends Employee qOverrideqpublic void getSalary() qSystem.out.print(Engineers:月薪5000元);qq 74qpublic class EngineersFactory implements IEmployeeFactory qpublic Employee CreateEmployee() q/ TODO

48、Auto-generated method stubqreturn new Engineers();qq75qFactory Method 模式是一個很簡單的模式,同學們以后會經(jīng)常用到它,它可以用于需要將對象實例化的規(guī)則推遲到某個派生類的情況,在這種情況下,將方法的實現(xiàn)放在負責該行為的對象中。76Abstract Factoryq抽象工廠模式是工廠方法模式的進一步擴廣化和抽象化.這兩個模式區(qū)別在于需要創(chuàng)建對象的復雜程度上 q意圖:提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。 q適用性 :q一個系統(tǒng)要獨立于它的產品的創(chuàng)建、組合和表示時。 q一個系統(tǒng)要由多個產品系列中的一個來配置時。 q當你要強調一系列相關的產品對象的設計以便進行聯(lián)合使用時。 q當你提供一個產品類庫,而只想顯示它們的接口而不是實現(xiàn)時。 77q結構7879q public class Client q private AbstractProductA abstractProductA;q private AbstractProductB abstractProductB;q public Client(AbstractFactory factory)q abstractProductB = (AbstractProduct

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論