版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
單例類圖singleton私有的構(gòu)造方加載時(shí)候,就實(shí)例化一個(gè)對交給自己的而懶漢在調(diào)用取得實(shí)例方法的時(shí)候會(huì)實(shí)例化對象。碼如下:餓漢式單publicpublicclassSingletonprivateSingleton(){}publicstaticSingleton}}懶漢式單publicpublicclassSingletonprivateSingleton(){}publicstaticsynchronizedSingletonsingleton=new}return}}單例模式的優(yōu)點(diǎn)避免頻繁的創(chuàng)建銷毀對象可以全局需要頻繁實(shí)例化然后銷毀的有狀態(tài)的工具類對象頻繁數(shù)據(jù)庫或文件的對象不要做斷開單例類對象與類中靜態(tài)的操作看到不少資料中說:如果一單例對象在內(nèi)存長久不,會(huì)被jvm認(rèn)為一個(gè),執(zhí)行收的時(shí)會(huì)清理掉。對此這個(gè)說法,筆持懷疑態(tài)度,筆本人的點(diǎn)是:在hotspot虛擬機(jī)1.6版本中,為斷開單例中靜態(tài)到單例對象的接,否則jvm收集器是不會(huì)回收單例對象的。在一個(gè)jv中會(huì)出現(xiàn)多個(gè)單例vm中,會(huì)不會(huì)產(chǎn)生單例呢?使用單例提供的geInstance()方法只能得到同一個(gè)單例,除非是使用反射方式,將會(huì)得到新的單例。代碼如下Classc=Class.forName(Singleton.class.getName());Constructorct=c.getDeclaredConstructor();Classc=Class.forName(Singleton.class.getName());Constructorct=c.getDeclaredConstructor();Singletonsingleton=主要是網(wǎng)上的一些說法,懶漢式的單例模式是線程不安全的,即使是在實(shí)例化對象的方法上加synchronize字,也依然是的,但是筆者經(jīng)過編碼測試,發(fā)現(xiàn)加synchronize關(guān)鍵字修飾后,雖然對性能有部分影響,但單例類可以被繼餓漢式單例好還是懶漢式單在java中,餓漢式單例要優(yōu)于懶漢式單例。C++中則一般使用懶漢式單例。工廠方法類圖!1.2factory工廠方法模式代}classProductimplementspublicvoidproductMethod}}publicIProduct}classFactoryimplements{publicIProductcreateProduct(){returnnewProduct();}}}{IFactoryfactory=newFactory();IProductprodect=factory.createProduct();}}工廠模式想要的產(chǎn)品。工廠方法模式少個(gè)具體的工廠實(shí)現(xiàn)。抽象類來代替,但要注意最不要里氏替原則。適用場景首先,作為一種創(chuàng)建類模式,在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式。有一點(diǎn)需要注意的地方就是復(fù)雜對象適合使用工廠模式,而簡單對象,特別是只需要通過nw就可以完成創(chuàng)建的對象,無需使用工廠典型classclassEngine{publicvoidgetStyleSystem.out.println("這是汽車}}classUnderpan{publicvoidgetStyleSystem.out.println("這是}}classWheel{publicgetStyleSystem.out.println("這是}}WheelWheelwheel=newICarcar=newCar(underpan,wheel,engine);}}的,嚴(yán)重了迪法則,耦合度太高。并且非常不利于擴(kuò)展。另外,本例中發(fā)動(dòng)機(jī)、底盤和輪胎還是比較interfaceIFactory{interfaceIFactory{}classFactoryimplements{publicICarcreateCar(){Engineengine=newEngine();Underpanunderpan=newUnderpan();Wheelwheel=newWheel();ICarcar=newCar(underpan,wheel,engine);returncar;}}{IFactoryfactory=newFactory();ICarcar=factory.createCar();}}抽象工廠類圖1.3 在抽象工廠模式中,有一個(gè)產(chǎn)品族的概念:所謂的產(chǎn)品族,是指位于不同產(chǎn)品等級結(jié)構(gòu)能相關(guān)聯(lián)的產(chǎn)品組成的。抽象工廠模式所提供的一系列產(chǎn)品就組成一個(gè)產(chǎn)品族;而工廠方法提供的一系列產(chǎn)品稱為一個(gè)等級結(jié) 2.4.4兩廂車和2.4抽象工廠模式代interfaceinterface{publicvoid}interface{publicvoid}}}classProduct2implements{publicvoidshow(){}}}classFactoryimplementsIFactory{publicIProduct1createProduct1(){returnnew}{returnnew}}publicstaticvoidmain(String[]args){IFactoryfactory=new抽象工廠模式的適用一個(gè)繼承體系中,如果存在著多個(gè)等級結(jié)構(gòu)(即存在著多個(gè)抽象類),并且分屬各個(gè)等級結(jié)構(gòu)中的實(shí)現(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)品;而建造者模式中,建造者類一般只提品類中各個(gè)組件的建造,而將具體建總原型類圖原型模式主要用于對象的,它的是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個(gè)條實(shí)現(xiàn)Cloneable接口。在java語言有一個(gè)Cloneable接口,它的作用只有一個(gè),就是在運(yùn)行時(shí)通知虛擬機(jī)可clonejavaCloeNtSupotedxceti重寫Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個(gè)clone方法,作用是返回對象的一個(gè)拷貝,但是其作用域protectd類型的,一般的類無法調(diào)用,因此,Prototype類需要將clone方法的作用域修改為public類型。實(shí)現(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)點(diǎn)及適用場使用原型模式創(chuàng)建對象比直接new一個(gè)對象在性能上要好的多,因?yàn)镺bject類的clone方法是一個(gè)本地方法,它直接操作內(nèi)存中的二進(jìn)制流特別是大對時(shí),性的差別非常明顯。原型模式的注意深拷貝與淺拷貝。Objet類的clone方法只會(huì)拷貝對象中的基本的數(shù)據(jù)類型,對于數(shù)組、容器對象、對象等都不會(huì)拷貝,這就是淺拷貝。如果要實(shí)現(xiàn)深拷貝,必須將原型模式中的數(shù)組、容器對象、對象等行拷貝。例如:publicpublicclassPrototypeimplements{privateArrayListlist=newArrayList();publicPrototypeclone(){Prototypeprototype=null;prototype=(Prototype)super.clone();e){e.printStackTrace();}return}}由于ArrayList不是基本類型,所以成員變量list,不會(huì)被拷貝,需要我們自己實(shí)現(xiàn)深拷貝,幸運(yùn)的是java類都實(shí)現(xiàn)了Cloneable接口。所以實(shí)現(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預(yù)設(shè)數(shù)據(jù)數(shù)publicstaticvoidmain(String[]}}運(yùn)行結(jié)果01345791012模版方法模式的模版方法的優(yōu)點(diǎn)及適用場中介者為什么要使用中發(fā)生變化,那么將會(huì)有4251.9mediator-我們使用一個(gè)例子來說明一下什么是同事類:有兩個(gè)類A和B,類中各有一個(gè)數(shù)字,并且要保證類B中的數(shù)字是類A中數(shù)字的100倍。也就是說,當(dāng)修改類A的數(shù)時(shí),將這個(gè)數(shù)字乘以100賦給類B,而修改類B時(shí),要將數(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通過直接的關(guān)聯(lián),假如我們要使用中介者模式,類A類B之間則不可以直接關(guān) {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ù)的情況,同事類之間的關(guān)系會(huì)復(fù)雜到的網(wǎng)狀結(jié)構(gòu),因此,大多數(shù)情況下,將對象間的依賴關(guān)系封裝的同事類內(nèi)部就可以的,沒有要非引入中介者模式。觀察者如,我們要設(shè)計(jì)一個(gè)自動(dòng)部署的功能,就像eclipse開發(fā)時(shí),只要修改了文件,eclipse署到服務(wù)器中。這兩個(gè)功能有一個(gè)相似的地方,那就是一個(gè)對象要時(shí)刻著另一個(gè)對象,只要它的狀態(tài)一發(fā)的選擇。觀察者模式的結(jié)被觀察者:從類圖中可以看到,類中有一個(gè)用來存放觀察者對象的Vector容器(之所以使用VectorList,是因?yàn)槎嗑€程操作時(shí),Vector在是安全的,而List則是不安全的),這個(gè)Vector容器是被觀察者,另外還有三個(gè)方法:attach方法是向這個(gè)容器中添加觀察者對象;detach方法是從容器中移除觀察者對象;otiy觀察者:觀察者角色一般是一個(gè)接口,它只有一個(gè)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}運(yùn)行被觀察者事件反觀察者2收到信息,并通過運(yùn)行結(jié)果可以看到,我們只調(diào)用了Subject的方法,但同時(shí)兩個(gè)觀察者的相關(guān)方法都被同時(shí)調(diào)用了。仔細(xì)看一下代碼,其實(shí)很簡單,無非就是在ubjet類中關(guān)聯(lián)一下Observr類,并且在dSomethng方法中遍歷一下sev的pae觀察者模式的優(yōu)構(gòu)中,比較容易出現(xiàn)循環(huán)的錯(cuò)誤,造成系假死??傋鲞^VC++、javascriptDOM或者AWT開發(fā)的朋友都對它們的事件處理感到神奇,了解了觀察者模式,就對事?lián)?,AWT中的事件處理DEM(委派事件模型DelegationEventModel)就是使用觀察者模式實(shí)現(xiàn)的。者模式classclassA{publicvoidmethod1(System.out.println("我是}publicvoidmethod2(Bb){}}classBpublicvoidshowA(Aa){}}args){Aa=newA();a.method2(newB());}}看懂了這個(gè)例子,就理解了者模式的90%,在例子中,對于類A來說,類B就是一個(gè)者。但是這個(gè)例子并不是者模式的全部,雖直觀,但是它的擴(kuò)展性較差,下面我們就來說一下者模式的通用現(xiàn),通過類圖可以看到,在者式中,主要包括面幾個(gè)色:**抽象者:**抽象類或者接口,者可以哪些元素,具體到程序中就是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());}}**者模式的適用場景但是,者式并是那完美,也有致命缺:增加的元類比通過者模的代可以看到在者類,每個(gè)元素都有對應(yīng)處方法,就是,每加一元素類需要改者類(也包括者類的子類者實(shí)現(xiàn)類),改起相麻煩。就是,在素類目不確的情下,慎用者模式。所以,者模式比較適用對已有能的重構(gòu),比如說,一個(gè)項(xiàng)的基本功能已經(jīng)定下者模式對原有的代碼進(jìn)行重構(gòu)一遍,這樣一來,就可以在不修改各個(gè)元素類的情況下,對原有功能進(jìn)行修改總正如《設(shè)計(jì)模式》的作者GoF對者模式的描述:大多數(shù)情況下,你并需要使用者模式,但是當(dāng)你一旦需要使用它時(shí),那你就是真的需要它了。當(dāng)然這只是針對真正的大牛而言。在現(xiàn)實(shí)情況下(至少是我所處的環(huán)境當(dāng)中),很多人往往沉迷于設(shè)計(jì)模式,他們使用一種設(shè)計(jì)模式時(shí),從來不去認(rèn)真考慮所使用的模式是否適合這種場景,而往往只是想展示一下自己對面向?qū)ο笤O(shè)計(jì)的駕馭能力。編程時(shí)有這種心理,往往會(huì)發(fā)生設(shè)計(jì)模式的情況。所以,在學(xué)習(xí)設(shè)計(jì)模式時(shí),一定要理解模式的適用性。必須做到使用一種模式是因?yàn)榱私馑膬?yōu)點(diǎn),不使用一種模式是因?yàn)榱私馑谋锥?;而不是使用一種模式是因?yàn)椴涣私馑谋锥耍皇褂靡环N模式是因?yàn)椴涣私馑膬?yōu)點(diǎn)。命令vk類:調(diào)用者,負(fù)責(zé)調(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)用,代碼的復(fù)用性很好。比如,文件的操作中,我們需要增加一個(gè)剪切文令,則只需要把文件和刪除文件這兩個(gè)命令組合一下就行了,非常方便命令模式的適用并不,我們大可以在真需要用到的時(shí)候?qū)ο到y(tǒng)行一下,引入這個(gè)設(shè)計(jì)模式。一個(gè)方法中,這個(gè)封裝的方可以稱之為命令但不是令模式。到底要這種計(jì)上升到模式的度就要責(zé)任連首先來看一段代request){if(i==1){}elseif(i{}elseif(i{}elseif(i{}}1或者是否為2,ifels就沒法看了。耦合度高:如果我們想繼續(xù)添加處理請求的類,那么就要繼續(xù)添加elseif判定條件;另外,這個(gè)條件判定的既然缺點(diǎn)我們已經(jīng)清楚了,就要想辦法來解決。這個(gè)場景的業(yè)務(wù)邏輯很簡單:如果滿足條件1,則由Handle1來處理,不滿足則向下傳遞;如果滿足條件2,則由Handler2來處理,不滿足則繼續(xù)向下傳遞,以此類推,直到條責(zé)任連模式的結(jié)抽象處理類:抽象處理類中主要包含一個(gè)指向下一處理類的成員變量nextHandler和一個(gè)處理請求的方法ndReuet,hadRquet方法的主要主要思想是,如果滿足處理的條件,則有本處理類來進(jìn)行處理,否則由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進(jìn)行處 return}}classclassConcreteHandler2extends{protectedLevelgetHandlerLevel(){returnnewLevel(3);}publicResponseresponse(Request{System.out.println("-----請求由處理器2進(jìn)行處 return}}classConcreteHandler3extends{protectedLevelgetHandlerLevel(){returnnewLevel(5);}publicResponseresponse(Request{System.out.println("-----請求由處理器3進(jìn)行處 return}}Handlerhandler1=newConcreteHandler1();Handlerhandler2=newConcreteHandler2();Handlerhandler3=newConcreteHandler3();Responseresponse=handler1.handleRequest(newRequest(new}}代碼中Leve;Requst,ResonseHadlerRequestClent功能與前文中的if…else…語句是一樣的。責(zé)任鏈模式的優(yōu)責(zé)任鏈模式的適用場總責(zé)任模其實(shí)是個(gè)靈版if…lse句是些定的放了處中樣優(yōu)點(diǎn)是比較靈活了,但同樣帶來了風(fēng)險(xiǎn),比設(shè)置處類前后關(guān)系時(shí),一定要特別細(xì),搞對處理類后邏輯的條件判斷關(guān)系,并且注意要在鏈中出現(xiàn)循環(huán) 的題。策略類圖替換。面的行為類模式中,有一種模式也是關(guān)注對算法的封裝——模版方法模式,對照類圖可以看Context,ontext中,抽象策略Strateg的。策略模式的結(jié)封裝類:也叫上下文,對策略進(jìn)行二次封裝,目的是避免模塊對策略的直接調(diào)用interfaceIStrategy{interfaceIStrategy{}classConcreteStrategy1implements{publicvoiddoSomething(){}}classConcreteStrategy2implements{publicvoiddoSomething(){}}classContextpublicContext(IStrategystrategy){this.strategy=}publicexecute(){}}args){Contextcontext; context=newContext(newConcreteStrategy1()); context=newContext(newConcreteStrategy2());}策略模式的優(yōu)缺策略模式的主要各個(gè)策略類會(huì)給開發(fā)帶來額外開銷,可能大家在這方面都有經(jīng)驗(yàn):一般來說,策略類的數(shù)量超過5比較令人頭疼了。必須對客戶端(調(diào)用者)所有的策略類,因?yàn)槭褂媚姆N策略是由客戶端來決定的,因此,客戶端應(yīng)該道有什么策略,并且了解各種策略之間的區(qū)別,否則,很嚴(yán)重。例如,有一個(gè)排序算法的策略模式,表和數(shù)組有什么區(qū)別?就這點(diǎn)來說是有悖于法的。適用用代碼后,,即使之前從來沒有聽策略模式,在開發(fā)過程中也一定使用過它吧?至少在在以下兩種情迭代器類圖publicpublicstaticvoidprint(Collection}}式,Iteator譯成語就迭代器意思提到代,首先是與集相關(guān),集也叫、容等,可以將集合看成是一個(gè)可以包容對象的容器,例如List,Set,Map,甚至數(shù)組都可以叫做集合,而迭代器的作用迭代器模式的結(jié)抽象容器:一般是一個(gè)接口,提供一個(gè)iterator()方法,例如java中的Collection接口,List接口,Set等。抽象迭代器:定義遍歷元素所需要的方法,一般來說會(huì)有這么三個(gè)方法:取得第一個(gè)元素的方法first下一個(gè)元素的方法next(),判斷是否遍歷結(jié)束的方法isne()(或者叫hasNext()),移出當(dāng)前對象的方法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是迭代器接口,主要有兩個(gè)方法:取得迭代對象方法next,判斷是否迭代完成方法hasNext,大家可以對比java.util.List和java.til.Iteratorhash迭代器模式的缺迭代器模式的適用場解釋器類圖終結(jié)符表達(dá)式:實(shí)現(xiàn)與文法中的元素相關(guān)聯(lián)的解釋操作,通常一個(gè)解釋器模式中只有一個(gè)終結(jié)符表達(dá)式,但有多個(gè)實(shí)例,對應(yīng)不同的終結(jié)符。終結(jié)符一半是文法中的運(yùn)算單元,比一個(gè)簡單的公式R=R1+R2,在里面1R21R2者其他關(guān)鍵字,比如公式R=R1+R2中,+就是非終結(jié)符,解析+的解釋器就是一個(gè)非終結(jié)符表達(dá)式。非終結(jié)環(huán)境角色:這個(gè)角色的任務(wù)一般是用來存放文法中各個(gè)終結(jié)符所對應(yīng)的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環(huán)境角色中,很多情況下我們使用Map來充當(dāng)環(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)但是,解釋器模式會(huì)引起類的膨脹,每個(gè)語法都需要產(chǎn)生一個(gè)非終結(jié)符表達(dá)式,語則比較復(fù)雜時(shí),就可能生大量的類文件,為帶來非常多的麻煩。同時(shí),由于采用遞歸調(diào)用方法,每個(gè)非終結(jié)符表達(dá)式只關(guān)心與自解釋器模式的適用場一些重復(fù)發(fā)生的問題,比如加減乘除四則運(yùn)算,但是公式每次都不同,有時(shí)是a+b-cd,有時(shí)是bc-注意解釋器模式真的是一個(gè)比較少用的模式,因?yàn)閷λ膶?shí)在是太麻煩了,想象一下,一坨一坨的非終結(jié)符解等問題。備忘錄備忘錄模式的結(jié)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();}}代碼演示了一個(gè)單狀態(tài)單備份的例子,邏輯非常簡單:Originator類中的sate恢復(fù);Memento類中,也有一個(gè)state變量,用來Originator類中state變量的臨時(shí)狀態(tài);而Caretaker多狀態(tài)多備份備,OriinaorsatejavaBean,Meentap容器來所有的狀態(tài),在Ca
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年高級環(huán)保水泥磚采購與銷售協(xié)議范本
- 單位鋪面招租合同模板
- 出售汽車要不要寫合同模板
- 票據(jù)貼現(xiàn)業(yè)務(wù)合同模板
- 購買水電材料合同模板
- 酒館門面出租合同模板
- 承包溝渠養(yǎng)鴨合同模板
- 酒吧藝人簽約合同模板
- 管護(hù)工程合同模板
- GB/T 12325-2008電能質(zhì)量供電電壓偏差
- GB/T 12220-1989通用閥門標(biāo)志
- 初級插花理論知識考核試題及答案
- 河南省洛陽市《綜合能力測試》事業(yè)單位國考真題
- 法醫(yī)物證學(xué)第十二章血痕檢驗(yàn)1
- 智慧消防整體解決方案消防大數(shù)據(jù)一體化管理平臺解課件
- 國家自然科學(xué)基金申請經(jīng)驗(yàn)匯總課件
- 社會(huì)實(shí)踐鑒定表
- 2022版義務(wù)教育(化學(xué))課程標(biāo)準(zhǔn)(含2022年修訂部分)
- 公司吸煙管理規(guī)定范文
- 消毒記錄表(簡單模板)
評論
0/150
提交評論