學習-23種設計模式是一套被反復使用、多數(shù)人知曉經(jīng)過分類編目的代碼_第1頁
學習-23種設計模式是一套被反復使用、多數(shù)人知曉經(jīng)過分類編目的代碼_第2頁
學習-23種設計模式是一套被反復使用、多數(shù)人知曉經(jīng)過分類編目的代碼_第3頁
學習-23種設計模式是一套被反復使用、多數(shù)人知曉經(jīng)過分類編目的代碼_第4頁
學習-23種設計模式是一套被反復使用、多數(shù)人知曉經(jīng)過分類編目的代碼_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單例類圖singleton私有的構造方加載時候,就實例化一個對交給自己的而懶漢在調(diào)用取得實例方法的時候會實例化對象。碼如下:餓漢式單publicpublicclassSingletonprivateSingleton(){}publicstaticSingleton}}懶漢式單publicpublicclassSingletonprivateSingleton(){}publicstaticsynchronizedSingletonsingleton=new}return}}單例模式的優(yōu)點避免頻繁的創(chuàng)建銷毀對象可以全局需要頻繁實例化然后銷毀的有狀態(tài)的工具類對象頻繁數(shù)據(jù)庫或文件的對象不要做斷開單例類對象與類中靜態(tài)的操作看到不少資料中說:如果一單例對象在內(nèi)存長久不,會被jvm認為一個,執(zhí)行收的時會清理掉。對此這個說法,筆持懷疑態(tài)度,筆本人的點是:在hotspot虛擬機1.6版本中,為斷開單例中靜態(tài)到單例對象的接,否則jvm收集器是不會回收單例對象的。在一個jv中會出現(xiàn)多個單例vm中,會不會產(chǎn)生單例呢?使用單例提供的geInstance()方法只能得到同一個單例,除非是使用反射方式,將會得到新的單例。代碼如下Classc=Class.forName(Singleton.class.getName());Constructorct=c.getDeclaredConstructor();Classc=Class.forName(Singleton.class.getName());Constructorct=c.getDeclaredConstructor();Singletonsingleton=主要是網(wǎng)上的一些說法,懶漢式的單例模式是線程不安全的,即使是在實例化對象的方法上加synchronize字,也依然是的,但是筆者經(jīng)過編碼測試,發(fā)現(xiàn)加synchronize關鍵字修飾后,雖然對性能有部分影響,但單例類可以被繼餓漢式單例好還是懶漢式單在java中,餓漢式單例要優(yōu)于懶漢式單例。C++中則一般使用懶漢式單例。工廠方法類圖!1.2factory工廠方法模式代}classProductimplementspublicvoidproductMethod}}publicIProduct}classFactoryimplements{publicIProductcreateProduct(){returnnewProduct();}}}{IFactoryfactory=newFactory();IProductprodect=factory.createProduct();}}工廠模式想要的產(chǎn)品。工廠方法模式少個具體的工廠實現(xiàn)。抽象類來代替,但要注意最不要里氏替原則。適用場景首先,作為一種創(chuàng)建類模式,在任何需要生成復雜對象的地方,都可以使用工廠方法模式。有一點需要注意的地方就是復雜對象適合使用工廠模式,而簡單對象,特別是只需要通過nw就可以完成創(chuàng)建的對象,無需使用工廠典型classclassEngine{publicvoidgetStyleSystem.out.println("這是汽車}}classUnderpan{publicvoidgetStyleSystem.out.println("這是}}classWheel{publicgetStyleSystem.out.println("這是}}WheelWheelwheel=newICarcar=newCar(underpan,wheel,engine);}}的,嚴重了迪法則,耦合度太高。并且非常不利于擴展。另外,本例中發(fā)動機、底盤和輪胎還是比較interfaceIFactory{interfaceIFactory{}classFactoryimplements{publicICarcreateCar(){Engineengine=newEngine();Underpanunderpan=newUnderpan();Wheelwheel=newWheel();ICarcar=newCar(underpan,wheel,engine);returncar;}}{IFactoryfactory=newFactory();ICarcar=factory.createCar();}}抽象工廠類圖1.3 在抽象工廠模式中,有一個產(chǎn)品族的概念:所謂的產(chǎn)品族,是指位于不同產(chǎn)品等級結構能相關聯(lián)的產(chǎn)品組成的。抽象工廠模式所提供的一系列產(chǎn)品就組成一個產(chǎn)品族;而工廠方法提供的一系列產(chǎn)品稱為一個等級結 2.4.4兩廂車和2.4抽象工廠模式代interfaceinterface{publicvoid}interface{publicvoid}}}classProduct2implements{publicvoidshow(){}}}classFactoryimplementsIFactory{publicIProduct1createProduct1(){returnnew}{returnnew}}publicstaticvoidmain(String[]args){IFactoryfactory=new抽象工廠模式的適用一個繼承體系中,如果存在著多個等級結構(即存在著多個抽象類),并且分屬各個等級結構中的實現(xiàn)類之間總建造者類圖1.5builder-pattern代碼classProduct{privateclassProduct{privateStringname;privateStringtype;publicvoidshowProduct(){}publicvoidsetName(String{=}{this.type=}} ProductgetProduct();}classConcreteBuilderextends{privateProductproduct=new{return}}}privateBuilderbuilder=newConcreteBuilder();publicProductgetAProduct(){returnbuilder.getProduct();}public奧迪汽車","Q5return}}Productproduct1=director.getAProduct();Productproduct2=director.getBProduct();}}}建造者模式的優(yōu)廠類向客戶端提供最終的產(chǎn)品;而建造者模式中,建造者類一般只提品類中各個組件的建造,而將具體建總原型類圖原型模式主要用于對象的,它的是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條實現(xiàn)Cloneable接口。在java語言有一個Cloneable接口,它的作用只有一個,就是在運行時通知虛擬機可clonejavaCloeNtSupotedxceti重寫Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個clone方法,作用是返回對象的一個拷貝,但是其作用域protectd類型的,一般的類無法調(diào)用,因此,Prototype類需要將clone方法的作用域修改為public類型。實現(xiàn)代碼classclassPrototypeimplements{publicPrototypeclone(){Prototypeprototype=null;prototype=}catch(CloneNotSupportedException}return}}classConcretePrototypeextendsPrototype{publicvoidshow(){}}publicstaticvoidmain(String[]args){ConcretePrototypecp=newConcretePrototype();for(inti=0;i<10;i++){ConcretePrototypeclonecp=(ConcretePrototype)cp.clone();}}}原型模式的優(yōu)點及適用場使用原型模式創(chuàng)建對象比直接new一個對象在性能上要好的多,因為Object類的clone方法是一個本地方法,它直接操作內(nèi)存中的二進制流特別是大對時,性的差別非常明顯。原型模式的注意深拷貝與淺拷貝。Objet類的clone方法只會拷貝對象中的基本的數(shù)據(jù)類型,對于數(shù)組、容器對象、對象等都不會拷貝,這就是淺拷貝。如果要實現(xiàn)深拷貝,必須將原型模式中的數(shù)組、容器對象、對象等行拷貝。例如:publicpublicclassPrototypeimplements{privateArrayListlist=newArrayList();publicPrototypeclone(){Prototypeprototype=null;prototype=(Prototype)super.clone();e){e.printStackTrace();}return}}由于ArrayList不是基本類型,所以成員變量list,不會被拷貝,需要我們自己實現(xiàn)深拷貝,幸運的是java類都實現(xiàn)了Cloneable接口。所以實現(xiàn)深拷貝并不是特別。模版方法ASort@param publicvoidarray){this.sort(array);for(inti0iarray.length;}}}} classclassConcreteSort{protectedvoidarray){for(inti=0;1;selectSort(array,}}privatevoidselectSort(int[]array,int{intMinValue=32767;//最小值intindexMin=0;//最小值索引變intTemp;//暫存變for(inti=index;i<array.length;{if(array[i]<MinValue){//找到最小MinValue=array[i];// 最小indexMin=}}Temp=array[index];//交換兩數(shù)值array[index]=array[indexMin];array[indexMin]=Temp;}}<pre<preclass="java"name="code">publicclassClientpublicstaticinta1032195712043預設數(shù)據(jù)數(shù)publicstaticvoidmain(String[]}}運行結果01345791012模版方法模式的模版方法的優(yōu)點及適用場中介者為什么要使用中發(fā)生變化,那么將會有4251.9mediator-我們使用一個例子來說明一下什么是同事類:有兩個類A和B,類中各有一個數(shù)字,并且要保證類B中的數(shù)字是類A中數(shù)字的100倍。也就是說,當修改類A的數(shù)時,將這個數(shù)字乘以100賦給類B,而修改類B時,要將數(shù)除以100賦給類A。類A類B互相影響,就稱為同事類。代碼如下:{protectedint{return}publicvoidsetNumber(intnumber){this.number=number;} voidsetNumber(int Colleague}classColleagueA publicvoidsetNumber(int Colleague{this.number=number;}}classColleagueB publicvoidsetNumber(int Colleague{this.number=number;}}ColleaguecollA=newColleagueA();ColleaguecollB=new }}上面的代碼中,類A類B通過直接的關聯(lián),假如我們要使用中介者模式,類A類B之間則不可以直接關 {protectedint{return}publicvoidsetNumber(intnumber){this.number=number;} voidsetNumber(int Mediator}classColleagueA publicvoidsetNumber(int Mediator{this.number=number;}}classColleagueB publicvoidsetNumber(int Mediator{this.number=number;}} { Colleague Colleague Colleague Colleagueb)A=B=} void void}classMediator Mediatorpublic Colleague Colleague{super(a,}intnumber=A.getNumber();}intnumber=B.getNumber();}} ColleaguecollA=new ColleaguecollB=newMediatoram=newMediator(collA, }}中介者模式的優(yōu)以使原凌亂對象系清,但是果,則能帶來反效果一般說,有對于種同類之中介者模式是一種比較常用的模式,也是一種比較容易被的模式。對于大多數(shù)的情況,同事類之間的關系會復雜到的網(wǎng)狀結構,因此,大多數(shù)情況下,將對象間的依賴關系封裝的同事類內(nèi)部就可以的,沒有要非引入中介者模式。觀察者如,我們要設計一個自動部署的功能,就像eclipse開發(fā)時,只要修改了文件,eclipse署到服務器中。這兩個功能有一個相似的地方,那就是一個對象要時刻著另一個對象,只要它的狀態(tài)一發(fā)的選擇。觀察者模式的結被觀察者:從類圖中可以看到,類中有一個用來存放觀察者對象的Vector容器(之所以使用VectorList,是因為多線程操作時,Vector在是安全的,而List則是不安全的),這個Vector容器是被觀察者,另外還有三個方法:attach方法是向這個容器中添加觀察者對象;detach方法是從容器中移除觀察者對象;otiy觀察者:觀察者角色一般是一個接口,它只有一個update被觸發(fā)調(diào)用。觀察者模式代碼privateVectorobs=newpublicvoidaddObserver(Observerobs){this.obs.add(obs);}publicvoiddelObserver(Observerobs){this.obs.remove(obs);}protectednotifyObserver(){for(Observer}} void}classConcreteSubjectextends{publicvoiddoSomething(){}}interface{publicvoid}classConcreteObserver1implements{publicvoidupdate()}}classConcreteObserver2implements{publicvoidupdate()}}publicstaticvoidmain(String[]args){Subjectsub=newsub.addObserver(newConcreteObserver1());//添加觀察者1sub.addObserver(newConcreteObserver2());//添加觀察者2}運行被觀察者事件反觀察者2收到信息,并通過運行結果可以看到,我們只調(diào)用了Subject的方法,但同時兩個觀察者的相關方法都被同時調(diào)用了。仔細看一下代碼,其實很簡單,無非就是在ubjet類中關聯(lián)一下Observr類,并且在dSomethng方法中遍歷一下sev的pae觀察者模式的優(yōu)構中,比較容易出現(xiàn)循環(huán)的錯誤,造成系假死。總做過VC++、javascriptDOM或者AWT開發(fā)的朋友都對它們的事件處理感到神奇,了解了觀察者模式,就對事?lián)?,AWT中的事件處理DEM(委派事件模型DelegationEventModel)就是使用觀察者模式實現(xiàn)的。者模式classclassA{publicvoidmethod1(System.out.println("我是}publicvoidmethod2(Bb){}}classBpublicvoidshowA(Aa){}}args){Aa=newA();a.method2(newB());}}看懂了這個例子,就理解了者模式的90%,在例子中,對于類A來說,類B就是一個者。但是這個例子并不是者模式的全部,雖直觀,但是它的擴展性較差,下面我們就來說一下者模式的通用現(xiàn),通過類圖可以看到,在者式中,主要包括面幾個色:**抽象者:**抽象類或者接口,者可以哪些元素,具體到程序中就是visit方法中的參數(shù)定List、Set、MapclassElement void}}classConcreteElement1extends{publicvoiddoSomething(){}{}}classConcreteElement2extends{publicvoiddoSomething(){}{}}{}{}}class{publicstaticListListlist=newArrayList();Randomran=newRandom();intinta=list.add(newlist.add(new}}return}} =for(Elemente:list){e.accept(newVisitor());}}**者模式的適用場景但是,者式并是那完美,也有致命缺:增加的元類比通過者模的代可以看到在者類,每個元素都有對應處方法,就是,每加一元素類需要改者類(也包括者類的子類者實現(xiàn)類),改起相麻煩。就是,在素類目不確的情下,慎用者模式。所以,者模式比較適用對已有能的重構,比如說,一個項的基本功能已經(jīng)定下者模式對原有的代碼進行重構一遍,這樣一來,就可以在不修改各個元素類的情況下,對原有功能進行修改總正如《設計模式》的作者GoF對者模式的描述:大多數(shù)情況下,你并需要使用者模式,但是當你一旦需要使用它時,那你就是真的需要它了。當然這只是針對真正的大牛而言。在現(xiàn)實情況下(至少是我所處的環(huán)境當中),很多人往往沉迷于設計模式,他們使用一種設計模式時,從來不去認真考慮所使用的模式是否適合這種場景,而往往只是想展示一下自己對面向?qū)ο笤O計的駕馭能力。編程時有這種心理,往往會發(fā)生設計模式的情況。所以,在學習設計模式時,一定要理解模式的適用性。必須做到使用一種模式是因為了解它的優(yōu)點,不使用一種模式是因為了解它的弊端;而不是使用一種模式是因為不了解它的弊端,不使用一種模式是因為不了解它的優(yōu)點。命令vk類:調(diào)用者,負責調(diào)用 classInvokerprivateCommandpublicvoidmand(Command mand=}public }}class{public } mandextends{privateReceiverreceiver; receiver){this.receiver=}publicvoid{}}classReceiver{publicvoiddoSomething(){System.out.println("接受}}publicstaticvoidmain(String[]args){Receiverreceiver=newCommandcommand= InvokerinvokernewInvoker();}}命令模式的優(yōu)缺令,而無需知道命令具體是怎么執(zhí)行的。比一組文件操作令:新建文件、文件、刪除文件。如果則無需知道??晒┱{(diào)用,也有大量令類可供調(diào)用,代碼的復用性很好。比如,文件的操作中,我們需要增加一個剪切文令,則只需要把文件和刪除文件這兩個命令組合一下就行了,非常方便命令模式的適用并不,我們大可以在真需要用到的時候?qū)ο到y(tǒng)行一下,引入這個設計模式。一個方法中,這個封裝的方可以稱之為命令但不是令模式。到底要這種計上升到模式的度就要責任連首先來看一段代request){if(i==1){}elseif(i{}elseif(i{}elseif(i{}}1或者是否為2,ifels就沒法看了。耦合度高:如果我們想繼續(xù)添加處理請求的類,那么就要繼續(xù)添加elseif判定條件;另外,這個條件判定的既然缺點我們已經(jīng)清楚了,就要想辦法來解決。這個場景的業(yè)務邏輯很簡單:如果滿足條件1,則由Handle1來處理,不滿足則向下傳遞;如果滿足條件2,則由Handler2來處理,不滿足則繼續(xù)向下傳遞,以此類推,直到條責任連模式的結抽象處理類:抽象處理類中主要包含一個指向下一處理類的成員變量nextHandler和一個處理請求的方法ndReuet,hadRquet方法的主要主要思想是,如果滿足處理的條件,則有本處理類來進行處理,否則由exHanleclassclassLevelprivateintlevel=0;this.level=level;level){if(this.level>=level.level){returntrue;}return}}class{LevelpublicRequest(Level}publicLevel}}classResponse}class{privateHandlerpublicfinalResponsehandleRequest(Requestrequest){Responseresponse=null;response=this.response(request);if(this.nextHandlernull){ }}return}publicvoidsetNextHandler(Handlerhandler){this.nextHandler=handler;} Responseresponse(Request}classConcreteHandler1extends{protectedLevelgetHandlerLevel(){returnnewLevel(1);}publicResponseresponse(Request{System.out.println("-----請求由處理器1進行處 return}}classclassConcreteHandler2extends{protectedLevelgetHandlerLevel(){returnnewLevel(3);}publicResponseresponse(Request{System.out.println("-----請求由處理器2進行處 return}}classConcreteHandler3extends{protectedLevelgetHandlerLevel(){returnnewLevel(5);}publicResponseresponse(Request{System.out.println("-----請求由處理器3進行處 return}}Handlerhandler1=newConcreteHandler1();Handlerhandler2=newConcreteHandler2();Handlerhandler3=newConcreteHandler3();Responseresponse=handler1.handleRequest(newRequest(new}}代碼中Leve;Requst,ResonseHadlerRequestClent功能與前文中的if…else…語句是一樣的。責任鏈模式的優(yōu)責任鏈模式的適用場總責任模其實是個靈版if…lse句是些定的放了處中樣優(yōu)點是比較靈活了,但同樣帶來了風險,比設置處類前后關系時,一定要特別細,搞對處理類后邏輯的條件判斷關系,并且注意要在鏈中出現(xiàn)循環(huán) 的題。策略類圖替換。面的行為類模式中,有一種模式也是關注對算法的封裝——模版方法模式,對照類圖可以看Context,ontext中,抽象策略Strateg的。策略模式的結封裝類:也叫上下文,對策略進行二次封裝,目的是避免模塊對策略的直接調(diào)用interfaceIStrategy{interfaceIStrategy{}classConcreteStrategy1implements{publicvoiddoSomething(){}}classConcreteStrategy2implements{publicvoiddoSomething(){}}classContextpublicContext(IStrategystrategy){this.strategy=}publicexecute(){}}args){Contextcontext; context=newContext(newConcreteStrategy1()); context=newContext(newConcreteStrategy2());}策略模式的優(yōu)缺策略模式的主要各個策略類會給開發(fā)帶來額外開銷,可能大家在這方面都有經(jīng)驗:一般來說,策略類的數(shù)量超過5比較令人頭疼了。必須對客戶端(調(diào)用者)所有的策略類,因為使用哪種策略是由客戶端來決定的,因此,客戶端應該道有什么策略,并且了解各種策略之間的區(qū)別,否則,很嚴重。例如,有一個排序算法的策略模式,表和數(shù)組有什么區(qū)別?就這點來說是有悖于法的。適用用代碼后,,即使之前從來沒有聽策略模式,在開發(fā)過程中也一定使用過它吧?至少在在以下兩種情迭代器類圖publicpublicstaticvoidprint(Collection}}式,Iteator譯成語就迭代器意思提到代,首先是與集相關,集也叫、容等,可以將集合看成是一個可以包容對象的容器,例如List,Set,Map,甚至數(shù)組都可以叫做集合,而迭代器的作用迭代器模式的結抽象容器:一般是一個接口,提供一個iterator()方法,例如java中的Collection接口,List接口,Set等。抽象迭代器:定義遍歷元素所需要的方法,一般來說會有這么三個方法:取得第一個元素的方法first下一個元素的方法next(),判斷是否遍歷結束的方法isne()(或者叫hasNext()),移出當前對象的方法remove(),代碼interfaceinterface{publicObjectnext();}classConcreteIteratorimplementsIterator{privateListlist=newprivateintcursor=0;}publicbooleanreturnfalse;}return}{Objectobj=null;obj=}return}}interfaceAggregatepublicvoidadd(Objectobj);publicvoidremove(Objectobj);publicIteratoriterator();}classConcreteAggregateimplements{}returnnew}{}}publicstaticvoidmain(String[]args){Aggregateag=newConcreteAggregate();ag.add(" }}}上面的代碼中,Aggregate是容器類接口,大家可以想象一下Collection,List,Set等,Aggregate就是他們的ad、刪除對象方法removeiteratr。erator是迭代器接口,主要有兩個方法:取得迭代對象方法next,判斷是否迭代完成方法hasNext,大家可以對比java.util.List和java.til.Iteratorhash迭代器模式的缺迭代器模式的適用場解釋器類圖終結符表達式:實現(xiàn)與文法中的元素相關聯(lián)的解釋操作,通常一個解釋器模式中只有一個終結符表達式,但有多個實例,對應不同的終結符。終結符一半是文法中的運算單元,比一個簡單的公式R=R1+R2,在里面1R21R2者其他關鍵字,比如公式R=R1+R2中,+就是非終結符,解析+的解釋器就是一個非終結符表達式。非終結環(huán)境角色:這個角色的任務一般是用來存放文法中各個終結符所對應的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環(huán)境角色中,很多情況下我們使用Map來充當環(huán)境角色就足夠了。代碼classclassContextclassExpression Objectinterpreter(Context}classTerminalExpressionextends{publicObjectinterpreter(Contextctx){returnnull;}}classNonterminalExpressionextendsExpression{}ctx){returnnull;}}publicstaticvoidmain(String[]args){Stringexpression="";char[]charArray=expression.toCharArray();Contextctx=newContext();Stackstack=newStack();for(inti=0;i}Expressionexp=stack.pop();}}解釋器模式的優(yōu)但是,解釋器模式會引起類的膨脹,每個語法都需要產(chǎn)生一個非終結符表達式,語則比較復雜時,就可能生大量的類文件,為帶來非常多的麻煩。同時,由于采用遞歸調(diào)用方法,每個非終結符表達式只關心與自解釋器模式的適用場一些重復發(fā)生的問題,比如加減乘除四則運算,但是公式每次都不同,有時是a+b-cd,有時是bc-注意解釋器模式真的是一個比較少用的模式,因為對它的實在是太麻煩了,想象一下,一坨一坨的非終結符解等問題。備忘錄備忘錄模式的結classclassOriginatorpublicString{return}{this.state=}publiccreateMemento(){returnnewpublicvoidmemento){}}classMementoprivateStringstate="";publicMemento(Stringstate){}publicString{return}{this.state=}}classCaretakerprivateMementomemento;publicMementogetMemento(){return}publicvoidsetMemento(Mementomemento){this.memento=memento;}}publicstaticvoidmain(String[]args){Originatororiginator=newCaretakercaretaker=newCaretaker();}}代碼演示了一個單狀態(tài)單備份的例子,邏輯非常簡單:Originator類中的sate恢復;Memento類中,也有一個state變量,用來Originator類中state變量的臨時狀態(tài);而Caretaker多狀態(tài)多備份備,OriinaorsatejavaBean,Meentap容器來所有的狀態(tài),在Ca

溫馨提示

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

評論

0/150

提交評論